设计模式(16)-迭代器模式

来源:互联网 发布:局域网打印机端口 编辑:程序博客网 时间:2024/04/30 13:25

简介

为什么要使用迭代器模式

在软件设计中,我们常用聚合对象来存储和遍历数据。存储和遍历是两个职责,如果都放在聚合对象中,就违反了“单一职责原则”。迭代器模式就是为了解决这个问题而产生的。迭代器模式将遍历的职责从聚合对象中剥离出来,放在一个称为迭代器的类中,使其更符合“单一职责原则”。

什么是迭代器模式

迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象中的各个元素,而不用暴露这个对象的内部表示。

别名

游标(Cursor)

类型

对象行为型模式

遵守的原则

单一职责原则、开闭原则

使用频率

★★★★★

角色

角色

  • Iterator:抽象迭代器
    • 抽象类
    • 具体迭代器的父类。
    • 定义访问和遍历元素的接口。
  • ConcreteIterator:具体迭代器
    • 具体类
    • 继承抽象迭代器。
    • 实现了访问和遍历元素的方法。
    • 对该聚合对象遍历时跟踪当前位置。
  • Aggregate:抽象聚合类
    • 抽象类
    • 存储和管理元素对象。
    • 定义创建相应迭代器对象的接口,充当抽象迭代器工厂角色。
  • ConcreteAggregate :具体聚合类
    • 具体类
    • 继承抽象聚合类。
    • 实现Aggregate的方法,创建ConcreteIterator对象。

UML类图

MarkdownPhotos/master/CSDNBlogs/DesignPatterns/iterator.png

实现

  • 创建抽象聚合类Aggregate.java
  • 创建具体聚合类ConcreteAggregate.java
  • 创建抽象迭代器Iterator.java
  • 创建具体迭代器ConcreteIterator.java
  • 创建客户类Client.java

抽象聚合类
Aggregate.java

interface Aggregate {    Iterator createIterator();}

具体聚合类
ConcreteAggregate.java

class ConcreteAggregate implements Aggregate {    //在这里,根据实际情况定义要存储的数据    public ConcreteIterator createIterator() {        return new ConcreteIterator(this);    }}

抽象迭代器
Iterator.java

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

具体迭代器
ConcreteIterator.java

class ConcreteIterator implements Iterator {    private ConcreteAggregate aggregate; // 维持一个对具体聚合对象的引用,以便于访问存储在聚合对象中的数据    private int cursor; // 定义一个游标,用于记录当前访问位置    public ConcreteIterator(ConcreteAggregate aggregate) {        this.aggregate = aggregate;    }    public void first() {        //根据实际情况实现方法    }    public void next() {        //根据实际情况实现方法    }    public boolean hasNext() {        //根据实际情况实现方法        return false;    }    public Object currentItem() {        //根据实际情况实现方法        return null;    }}

客户类
Client.java

public class Client {    public static void main(String[] args) {        ConcreteAggregate aggregate = new ConcreteAggregate();        ConcreteIterator iterator = aggregate.createIterator();        iterator.first();    }}

优缺点

优点

  • 遵守“单一职责原则”。将聚合器类的遍历职责剥离出来,使聚合器类遵守“单一职责原则”。
  • 遵守“开闭原则”。由于有抽象聚合类和抽象迭代器类,添加新的聚合类和迭代器都不需要修改原有代码。
  • 支持以不同的遍历算法遍历聚合对象,只要用新的迭代器替换就的就可以。

缺点

  • 待补充

适用环境

  • 访问一个聚合对象的内容而无须暴露它的内部表示。
  • 需要为一个聚合对象提供多种遍历方式。
  • 为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口。

使用场景

Java的Iterator

  • Iterator.java作为抽象迭代器
  • Collection.java继承Iterator.java
  • ArrayList.java等容器实现Collection.java,作为聚合类,且其中包含获取迭代器的方法iterator()

抽象迭代器Iterator.java

package java.util;  public interface Iterator<E> {      boolean hasNext();      E next();      void remove();  } 

Collection.java

package java.util;  public interface Collection<E> extends Iterable<E> {      ……      Iterator iterator();      ……  }  

Java迭代器使用

Collection list = new ArrayList();list.add("1");list.add("2");list.add("3");Iterator iterator = list.iterator(); //通过迭代器遍历聚合对象  while(iterator.hasNext()) {      System.out.println(iterator.next().toString());  }

扩展

相关模式

  • 组合模式Composite:迭代器常被应用到像复合这样的递归结构上。
  • 工厂方法模式Facotory Method:多态迭代器靠Facotry Method来例化适当的迭代器子类。
  • 备忘录模式Memento:常与迭代器一起使用。迭代器可以使用memento捕获一个迭代的状态。迭代器在其内部存储memento。

问题

在软件开发中,你在哪里用到了迭代器模式?

待补充。

迭代器模式在JDK中有哪些运用?

  • ArrayList。详情请参考ArrayList与迭代器模式。
  • LinkedList。待补充。
  • Vector。待补充。
  • HashSet。待补充。
  • LinkedList。待补充。
  • TreeSet。待补充。
  • HashMap。待补充。
  • TreeMap。待补充。
原创粉丝点击