集册 23种设计模式 迭代器模式

迭代器模式

欢马劈雪     最近更新时间:2020-08-04 05:37:59

70

定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

类型:行为类模式

类图:

iterator-pattern

如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧:

    public static void print(Collection coll){
        Iterator it = coll.iterator();
        while(it.hasNext()){
            String str = (String)it.next();
            System.out.println(str);
        }
    }

这个方法的作用是循环打印一个字符串集合,里面就用到了迭代器模式,java语言已经完整地实现了迭代器模式,Iterator翻译成汉语就是迭代器的意思。提到迭代器,首先它是与集合相关的,集合也叫聚集、容器等,我们可以将集合看成是一个可以包容对象的容器,例如List,Set,Map,甚至数组都可以叫做集合,而迭代器的作用就是把容器中的对象一个一个地遍历出来。

迭代器模式的结构

  • 抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  • 具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
  • 抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove(),
  • 迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。

代码实现

    interface Iterator {
        public Object next();
        public boolean hasNext();
    }
    class ConcreteIterator implements Iterator{
        private List list = new ArrayList();
        private int cursor =0;
        public ConcreteIterator(List list){
            this.list = list;
        }
        public boolean hasNext() {
            if(cursor==list.size()){
                return false;
            }
            return true;
        }
        public Object next() {
            Object obj = null;
            if(this.hasNext()){
                obj = this.list.get(cursor++);
            }
            return obj;
        }
    }
    interface Aggregate {
        public void add(Object obj);
        public void remove(Object obj);
        public Iterator iterator();
    }
    class ConcreteAggregate implements Aggregate {
        private List list = new ArrayList();
        public void add(Object obj) {
            list.add(obj);
        }

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

        public void remove(Object obj) {
            list.remove(obj);
        }
    }
    public class Client {
        public static void main(String[] args){
            Aggregate ag = new ConcreteAggregate();
            ag.add("小明");
            ag.add("小红");
            ag.add("小刚");
            Iterator it = ag.iterator();
            while(it.hasNext()){
                String str = (String)it.next();
                System.out.println(str);
            }
        }
    }

上面的代码中,Aggregate是容器类接口,大家可以想象一下Collection,List,Set等,Aggregate就是他们的简化版,容器类接口中主要有三个方法:添加对象方法add、删除对象方法remove、取得迭代器方法iterator。Iterator是迭代器接口,主要有两个方法:取得迭代对象方法next,判断是否迭代完成方法hasNext,大家可以对比java.util.List和java.util.Iterator两个接口自行思考。


迭代器模式的优缺点

迭代器模式的优点有:

展开阅读全文