当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 行为模式之迭代器模式

行为模式之迭代器模式

2018年11月29日  | 移动技术网IT编程  | 我要评论
迭代器模式(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.

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网