迭代器模式(Iterator Pattern)

参考文章:

http://www.cnblogs.com/chenssy/p/3250409.html

https://www.cnblogs.com/chenssy/p/3250409.html

 

定义:

提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示

 

uml类图:

模式组成:

  • Iterator: 抽象迭代器:所有迭代器都需要实现的接口,提供了游走聚合对象元素之间的方法
  • ConcreteIterator: 具体迭代器。利用这个具体的迭代器能够对具体的聚合对象进行遍历。每一个聚合对象都应该对应一个具体的迭代器
  • Aggregate: 抽象聚合类
  • ConcreteAggregate: 具体聚合类。实现creatorIterator()方法,返回该聚合对象的迭代器

 

优点:

 

  • 能够遍历一个聚合对象 ,且不需要了解聚合对象的内部结构
  • 能够提供多种不同的遍历方式
  • 封装性良好简化遍历,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心
  • 增加新的聚合类和迭代器类都很方便,无须修改原有代码

 

应用场景:

  • 访问一个聚合对象的内容而无须暴露它的内部表示
  • 需要为聚合对象提供多种遍历方式
  • 为遍历不同的聚合结构提供一个统一的接口

于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。

 

      • java.util.Iterator
      • java.util.Enumeration

举个栗子:

 

 定义抽象迭代器

interface Iterator {
    public Object next();
    public boolean hasNext();
}

定义抽象聚合类

interface IMyList {
    public void add(Object o);
    public void remove(Object o);
    public Iterator iterator();
}

定义具体集合类

class ConcreteMyList implements IMyList {
    private List<Object> list = new ArrayList<Object>();

    public void add(Object o) {
        list.add(o);
    }

    public void remove(Object o) {
        list.remove(o);
    }

    public Iterator iterator() {
        return new ConcreteIterator(list);
    }

}

定义具体迭代器

class ConcreteIterator implements Iterator {
    private List<Object> list = new ArrayList<Object>();

    private int cursor = 0;

    public ConcreteIterator(List<Object> list) {
        this.list = list;
    }

    public Object next() {
        Object o = null;
        if (this.hasNext()) {
            o = list.get(cursor++);
        }
        return o;
    }

    public boolean hasNext() {
        if (cursor == list.size()) {
            return false;
        }
        return true;
    }

}

客户端调用

public static void main(String[] args) {
        IMyList list = new ConcreteMyList();
        list.add("11");
        list.add("22");
        list.add("33");

        Iterator it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

输出

 

posted @ 2017-12-05 15:22  情歌z  阅读(175)  评论(0编辑  收藏  举报