定义和特点
提供一种方法顺序访问一个聚合对象中各个元素。
Collection,List,Set,Map中都包含了迭代器,包括foreatch循环,都是迭代;
这里相当于是写迭代器的部分源码
优点
- 访问一个聚合对象的内容而无须暴露内部表示
- 便利任务交给迭代器完成,简化了聚合类
- 支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
- 增加新的聚合和迭代器类比较方便,并不需要修改原有的代码
- 封装性比较好,为遍历不同的聚合结构提供一个统一的接口
缺点
增加了类的个数,在一定程度上增加了系统的复杂性
结构与实现
- 抽象聚合(Aggregate):定义储存,添加,删除聚合对象以及创建迭代器对象的接口;
- 具体聚合(ConcreteAggregate):实现抽象聚合类,返回一个具体迭代器的实例。
- 抽象迭代器(Iterator):定义访问和遍历聚合元素的接口,通常包含hasNext(),first(),next()方法。
- 具体迭代器(ConcreIterator):实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置
抽象聚合
public interface Aggregate {public void add(Object obj);public void remove(Object obj);public Iterator getIterator();}
抽象迭代器
public interface Iterator {public Object first();public Object next();public boolean hasNext();}
具体聚合类
public class ConcreteAggregate implements Aggregate{public List<Object> list =new ArrayList<>();@Overridepublic void add(Object obj) {list.add(obj);}@Overridepublic void remove(Object obj) {list.remove(obj);}@Overridepublic Iterator getIterator() {//因为相当于写源码,所以这里是抽象迭代器的,并不是Java.util的return new ConcreteIterator(list);}}
具体的迭代器
public class ConcreteIterator implements Iterator{private List<Object> list = null;private int index = -1;public ConcreteIterator(List<Object> list) {this.list = list;}@Overridepublic Object first() {//取第一个return list.get(0);}@Overridepublic Object next() {//下一个Object obj = null;if (this.hasNext()){obj = list.get(++index);}return obj;}@Overridepublic boolean hasNext() {if(index < list.size() -1){return true;}else {return false;}}}
调用:
public class IteratorMain {public static void main(String[] args) {Aggregate ag =new ConcreteAggregate();ag.add("AAAA");ag.add("BBBB");ag.add("CCCC");ag.add("DDDD");System.out.println("聚合对象内容有:");Iterator it = ag.getIterator();while (it.hasNext()){Object ob = it.next();System.out.println(ob.toString());}System.out.println("第一个:"+it.first());}}
