欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

行为模式之迭代器模式

程序员文章站 2022-04-09 19:08:39
迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中。 定义:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。 类图如下所示。 迭代器模式有以下4个角色。 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口。 ......

迭代器模式(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.