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

设计模式 同时被 2 个专栏收录
32 篇文章 1 订阅
31 篇文章 16 订阅

简介

为什么要使用迭代器模式

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

什么是迭代器模式

迭代器模式(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。待补充。
  • 1
    点赞
  • 2
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值