定义和特点

提供一种方法顺序访问一个聚合对象中各个元素。

Collection,List,Set,Map中都包含了迭代器,包括foreatch循环,都是迭代;
这里相当于是写迭代器的部分源码

优点

  • 访问一个聚合对象的内容而无须暴露内部表示
  • 便利任务交给迭代器完成,简化了聚合类
  • 支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
  • 增加新的聚合和迭代器类比较方便,并不需要修改原有的代码
  • 封装性比较好,为遍历不同的聚合结构提供一个统一的接口

缺点

增加了类的个数,在一定程度上增加了系统的复杂性

结构与实现

  • 抽象聚合(Aggregate):定义储存,添加,删除聚合对象以及创建迭代器对象的接口;
  • 具体聚合(ConcreteAggregate):实现抽象聚合类,返回一个具体迭代器的实例。
  • 抽象迭代器(Iterator):定义访问和遍历聚合元素的接口,通常包含hasNext(),first(),next()方法。
  • 具体迭代器(ConcreIterator):实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置

抽象聚合

  1. public interface Aggregate {
  2. public void add(Object obj);
  3. public void remove(Object obj);
  4. public Iterator getIterator();
  5. }

抽象迭代器

  1. public interface Iterator {
  2. public Object first();
  3. public Object next();
  4. public boolean hasNext();
  5. }

具体聚合类

  1. public class ConcreteAggregate implements Aggregate{
  2. public List<Object> list =new ArrayList<>();
  3. @Override
  4. public void add(Object obj) {
  5. list.add(obj);
  6. }
  7. @Override
  8. public void remove(Object obj) {
  9. list.remove(obj);
  10. }
  11. @Override
  12. public Iterator getIterator() {
  13. //因为相当于写源码,所以这里是抽象迭代器的,并不是Java.util的
  14. return new ConcreteIterator(list);
  15. }
  16. }

具体的迭代器

  1. public class ConcreteIterator implements Iterator{
  2. private List<Object> list = null;
  3. private int index = -1;
  4. public ConcreteIterator(List<Object> list) {
  5. this.list = list;
  6. }
  7. @Override
  8. public Object first() {
  9. //取第一个
  10. return list.get(0);
  11. }
  12. @Override
  13. public Object next() {
  14. //下一个
  15. Object obj = null;
  16. if (this.hasNext()){
  17. obj = list.get(++index);
  18. }
  19. return obj;
  20. }
  21. @Override
  22. public boolean hasNext() {
  23. if(index < list.size() -1){
  24. return true;
  25. }else {
  26. return false;
  27. }
  28. }
  29. }

调用:

  1. public class IteratorMain {
  2. public static void main(String[] args) {
  3. Aggregate ag =new ConcreteAggregate();
  4. ag.add("AAAA");
  5. ag.add("BBBB");
  6. ag.add("CCCC");
  7. ag.add("DDDD");
  8. System.out.println("聚合对象内容有:");
  9. Iterator it = ag.getIterator();
  10. while (it.hasNext()){
  11. Object ob = it.next();
  12. System.out.println(ob.toString());
  13. }
  14. System.out.println("第一个:"+it.first());
  15. }
  16. }