• 行为模式之迭代器模式


    迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中。

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

    类图如下所示。

     

     迭代器模式有以下4个角色。

    • 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口。
    • 具体迭代器(Concrete Iterator)角色:实现Iterator接口,完成容器元素的遍历。
    • 抽象聚集(Aggregate)角色:提供创建迭代器角色的接口。
    • 具体聚集(Concrete Aggregate)角色:实现抽象聚集接口,创建出容纳迭代器的对象。

     Iterator.java

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

    ConcreteIterator.java

    public class ConcreteIterator implements Iterator {
        private ConcreteAggregate agg;
        private int index = 0;
        private int size = 0;
        public ConcreteIterator(ConcreteAggregate agg) {
            this.agg = agg;
            size = agg.size();
            index = 0;
        }
        @Override
        public Object next() {
            if (index < size) {
                return agg.getElement(index++);
            } else {
                return null;
            }
        }
        @Override
        public boolean hasNext() {
            return index < size;
        }
    }

    Aggregate.java

    public interface Aggregate {
        public void add(Object obj);
        public Iterator createIterator();
    }

    ConcreteAggregate.java

    public class ConcreteAggregate implements Aggregate {
        private Vector vector = new Vector();
        @Override
        public void add(Object obj) {
            this.vector.add(obj);
        }
        public Object getElement(int index) {
            if (index < this.vector.size()) {
                return vector.get(index);
            } else {
                return null;
            }
        }
        public int size() {
            return vector.size();
        }
        @Override
        public Iterator createIterator() {
            return new ConcreteIterator(this);
        }
    }

    Client.java

    public class Client {
        public static void main(String[] args) {
            // 定义聚集对象
            Aggregate agg = new ConcreteAggregate();
            agg.add("张三");
            agg.add("李四");
            agg.add("王五");
            // 遍历
            Iterator iterator = agg.createIterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    }

    运行结果如下所示。

    张三
    李四
    王五

    优点:

    • 简化了访问容器元素的操作,具备一个统一的遍历接口。
    • 封装遍历算法,使算法独立于聚集角色。客户无须知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历进程。

    缺点:

    • 给使用者一个序列化的错觉,从而产生错误。

    应用场景:

    • 在java开发中,尽量不要自己写迭代器模式,使用Java API提供的Iterator一般就能满足项目要求。

    摘自:

    青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,133-138.

  • 相关阅读:
    VS2010的新特性:3.新要害词 Dynamic
    VS2010的新特性:1.可选参数
    VS2010的新特性:4.简化了对 Office API 对象的访问
    VS2010的新特性:2.命实参数
    Not beside my body,but inside my heart!
    Tears...
    首乘“子弹头”列车
    What doesn't kill me makes me stronger!
    HongKong Business Trip
    胃部不适,原来好辛苦!
  • 原文地址:https://www.cnblogs.com/yewen1234/p/10030726.html
Copyright © 2020-2023  润新知