迭代器模式:按照顺序一次遍历集合中所有的元素
优点:依序遍历元素,不会存在漏掉的情况
实现:模拟一个公交车售票员售票的场景,不管车上乘客是什么人,坐车一律需要买票
1、抽象迭代器、抽象集合类
/*** 迭代抽象类*/public abstract class Iterator {/*** 获取第一个对象*/public abstract Object first();/*** 获取下一个对象*/public abstract Object next();/*** 是否最后一个*/public abstract Boolean idDone();/*** 获取当前对象*/public abstract Object currentItem();}/*** 集合抽象类*/public abstract class Aggregate {/*** 创建迭代器*/public abstract Iterator createIterator();}
2、具体迭代器、具体集合类
/*** 具体迭代器*/public class ConcreteIterator extends Iterator{//集合类private ConcreteAggregate aggregate;private int current = 0;public ConcreteIterator(ConcreteAggregate aggregate){this.aggregate = aggregate;}/*** 获取第一个对象*/public Object first(){return aggregate.getItem(0);}/*** 获取下一个对象*/public Object next(){Object next = null;current++;if (current < aggregate.count()){next = aggregate.getItem(current);}return next;}/*** 是否最后一个*/public Boolean idDone(){return current < aggregate.count() ? false : true;}/*** 获取当前对象*/public Object currentItem(){return aggregate.getItem(current);}}/*** 具体集合类*/public class ConcreteAggregate extends Aggregate{private List<Object> item = new ArrayList<>();public Iterator createIterator(){return new ConcreteIterator(this);}public int count(){return item.size();}public Object getItem(int number){return item.get(number);}public void setItem(Object value){item.add(value);}}
3、测试类
/*** 测试迭代器模式*/public class TestIterator {public static void main(String [] args){ConcreteAggregate concreteAggregate = new ConcreteAggregate();concreteAggregate.setItem("乘客1");concreteAggregate.setItem("乘客2");concreteAggregate.setItem("乘客3");concreteAggregate.setItem("公司员工");concreteAggregate.setItem("小偷");Iterator iterator = concreteAggregate.createIterator();Object item = iterator.first();System.out.println(MessageFormat.format("第一个乘客{0}", item));while (!iterator.idDone()){System.out.println(MessageFormat.format("{0}请买票" , iterator.currentItem()));iterator.next();}}}
测试结果:
迭代器模式就是我们最常用的foreach,现在已经封装的很成熟了,不需要自己去写,在此只是了解一下其原理
