美文网首页
设计模式之迭代器模式

设计模式之迭代器模式

作者: 老羊_肖恩 | 来源:发表于2017-06-13 11:15 被阅读11次

    迭代器模式的定义

    迭代器模式(Iterator Pattern)的定义如下:
      Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 即:它提供一种方法访问衣蛾容器对象各个元素,而不暴露该对象的内部细节。
      迭代器模式是为容器服务的,如Collection, Set等。迭代器模式就是为了解决便利这些容器中的元素而诞生的。其通用类图如下所示:


    Iterator.jpg

      适配器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器进行。看一下迭代器模式中的各个角色:

    • Iterator 抽象迭代器。抽象迭代器负责定义访问和遍历元素的接口。
    • ConcreteIterator 具体迭代器。实现抽象迭代器定义的接口,完成容器遍历。
    • Aggregate抽象容器。提供一个类似的iterator方法。
    • ConcreteAggregate具体容器。实现容器接口定义的方法,创建出容纳迭代器的对象。

    适配器模式的通用代码如下:

    import java.util.Vector;
    
    //抽象迭代器
    interface Iterator{
        //遍历下一个元素
        public Object next();
        //是否遍历到尾部
        public boolean haNext();
        //删除当前指向的元素
        public boolean remove();
    }
    
    //具体迭代器
    @SuppressWarnings("rawtypes")
    class ConcreteIterator implements Iterator{
    
        private Vector vector = new Vector();
        
        //定义当前游标
        private int cursor = 0;
        
        public ConcreteIterator(Vector vector) {
            this.vector = vector;
        }
        
        @Override
        public Object next() {
            if(this.haNext())
                return this.vector.get(cursor++);
            return null;
        }
    
        @Override
        public boolean haNext() {
            if(cursor == this.vector.size()){
                return false;
            }
            return true;
        }
    
        @Override
        public boolean remove() {
            this.vector.remove(cursor);
            return false;
        }
        
    }
    
    //抽象容器
    interface Aggregate{
        //增加元素
        public void add(Object obj);
        //删除元素
        public void remove(Object obj);
        
        //迭代器
        public Iterator iterator();
    }
    
    //具体容器类
    @SuppressWarnings("rawtypes")
    class ConreteAggregate implements Aggregate{
        private Vector vector = new Vector();
    
        @Override
        public void add(Object obj) {
            this.vector.add(obj);
        }
    
        @Override
        public void remove(Object obj) {
            this.vector.remove(obj);
        }
    
        @Override
        public Iterator iterator() {
            return new ConcreteIterator(vector);
        }
        
    }
    
    //客户端
    public class IteratorClient{
        public static void main(String[] args) { 
            //声明容器类
            Aggregate agg = new ConreteAggregate();
            
            //插入数据
            agg.add("1");
            agg.add("2");
            agg.add("3");
            
            //遍历
            Iterator iterator = agg.iterator();
            System.out.println("before iterator...");
            while (iterator.haNext()) {
                System.out.println(iterator.next());
            }
            System.out.println("after iterator...");
        }
    }
    

    通用代码的运行结果如下:

    before iterator...
    1
    2
    3
    after iterator...
    

    迭代器模式的应用

    JDK1.2开始增加了java.util.Iterator接口,将Iterator应用到各种Collections中。

    《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。

    相关文章

      网友评论

          本文标题:设计模式之迭代器模式

          本文链接:https://www.haomeiwen.com/subject/fqhafxtx.html