简说设计模式——迭代器模式

一、什么是迭代器模式

  迭代器这个词在Java中出现过,即Java中使用Iterator迭代器对集合进行遍历,但迭代器模式算是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发。

  迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。UML结构图如下:

  其中,Aggregate是聚集抽象类,负责提供创建具体迭代器角色的接口;Iterator是迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法,统一接口;ConcreteAggregate是具体聚集类,继承Aggregate;ConcreteIterator是具体迭代器类,继承Iterator,实现开始、下一个、是否结尾、当前对象等方法。

  1. 抽象容器

  负责提供接口,比如存在一个类似createIterator()这样的方法,在Java中一般是iterator()方法。

1 public interface Aggregate {
2
3     public void add(Object object);
4
5     public void remove(Object object);
6
7     public Iterator iterator();
8
9 }

  2. 抽象迭代器

  负责定义访问和遍历元素的接口,基本上有固定的三个方法,即first()获取第一个元素、next()访问下一个元素、hasNext()是否已经遍历到底部。

1 public interface Iterator {
2
3     public Object next();    //遍历到下一个元素
4
5     public boolean hasNext();    //是否已经遍历到尾部
6
7     public boolean remove();    //删除当前指向的元素
8
9 }

  3. 具体容器

1 public class ConcreteAggregate implements Aggregate {
 2
 3     private Vector vector = new Vector();
 4
 5     @Override
 6     public void add(Object object) {
 7         this.vector.add(object);
 8     }
 9
10     public void remove(Object object) {
11         this.remove(object);
12     }
13
14     @Override
15     public Iterator iterator() {
16         return new ConcreteIterator(this.vector);
17     }
18
19 }

  4. 具体迭代器

  简单的实现就是通过一个游标,在一个容器中上下翻滚,遍历所有它需要查看的元素。

1 public class ConcreteIterator implements Iterator {
 2
 3     private Vector vector = new Vector();
 4     public int cursor = 0;    //定义当前游标
 5
 6     public ConcreteIterator(Vector vector) {
 7         this.vector = vector;
 8     }
 9
10     @Override
11     public Object next() {
12         Object result = null;
13
14         if (this.hasNext()) {
15             result = this.vector.get(this.cursor ++);
16         } else {
17             result = null;
18         }
19
20         return result;
21     }
22
23     @Override
24     public boolean hasNext() {
25         if (this.cursor == this.vector.size()) {
26             return false;
27         }
28
29         return true;
30     }
31
32     @Override
33     public boolean remove() {
34         this.vector.remove(this.cursor);
35
36         return true;
37     }
38
39 }

  5. Client客户端

  下面测试一下,注意引入自定义的Iterator类,而不是Java封装好的Iterator类。

1 public class Client {
 2
 3     public static void main(String[] args) {
 4         Aggregate aggregate = new ConcreteAggregate();
 5         aggregate.add("abc");
 6         aggregate.add("aaa");
 7         aggregate.add("1234");
 8
 9         //遍历
10         Iterator iterator = aggregate.iterator();
11         while (iterator.hasNext()) {
12             System.out.println(iterator.next());
13         }
14     }
15
16 }

  运行结果如下:

  

二、迭代器模式的应用

  1. 何时使用

  • 遍历一个聚合对象时

  2. 方法

  • 把在元素间游走的责任交给迭代器,而不是聚合对象

  3. 优点

  • 支持以不同的方式遍历一个聚合对象
  • 迭代器简化了聚合类
  • 在同一个聚合上可以有多个遍历
  • 增加新的聚合类和迭代器类都很方便,无需修改原有代码

  4. 缺点

  • 增加了系统的复杂性。因为迭代器模式将存储数据和遍历数据的职责分离,增加了新的聚合类需要对应增加新的迭代器类,增加了系统的复杂性。

  5. 使用场景

  • 访问一个聚合对象的内容无需暴露它的内部表示时
  • 需要为聚合对象提供多种便利方式时
  • 为遍历不同的聚合结构提供一个统一的接口

  6. 应用实例

  • Java中的Iterator迭代器
  • foreach遍历

三、迭代器模式的实现

  这部分内容就不再赘述了,具体实现与上方代码没有太大区别,根据具体应用场景加以改变即可,当然也可以参考java.util.Iterator的源码。


  到此,常见的23种设计模式就介绍完了,所有源码皆已上传至码云,至于扩展的新模式(常用23个设计模式之外的设计模式),后续有机会会继续更新,短时间内不再编写有关设计模式的内容。

  源码地址:https://gitee.com/adamjiangwh/GoF

(0)

相关推荐

  • 大话设计模式笔记(十七)の迭代器模式

    迭代器模式 定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 什么时候用? 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式. ...

  • STL_迭代器

    一.迭代器基本原理 迭代器是一个"可遍历STL容器内全部或部分元素"的对象. 迭代器指出容器中的一个特定位置. 迭代器就如同一个指针. 迭代器提供对一个容器中的对象的访问方法,并且 ...

  • 软件设计模式修炼 -- 迭代器模式

    迭代器模式是一种使用频率非常高的设计模式,迭代器用于对一个聚合对象进行遍历.通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,聚合对象只负责存储数据,而遍历数据由迭代器来 ...

  • PHP设计模式—迭代器模式

    定义: 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 结构: Iterator:迭代器接口,用于定义得到开始对象.得到下一个对象.判断是否到 ...

  • 简说设计模式——访问者模式

    一.什么是访问者模式 访问者模式是一个相对比较简单,但结构又稍显复杂的模式,它讲的是表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.例如,你在 ...

  • 简说设计模式——解释器模式

    一.什么是解释器模式 解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树.诸如此类 ...

  • 简说设计模式——状态模式

    一.什么是状态模式 状态这个词汇我们并不陌生,在日常生活中,不同时间就有不同的状态,早上起来精神饱满,中文想睡觉,下午又渐渐恢复,晚上可能精神更旺也可能耗费体力只想睡觉,这一天中就对应着不同的状态.或 ...

  • 简说设计模式——命令模式

    一.什么是命令模式 在说命令模式前我们先来说一个小例子.很多人都有吃夜市的经历,对于那些推小车的摊位,通常只有老板一个人,既负责制作也负责收钱,我要两串烤串多放辣,旁边的人要了三串烤面筋不要辣,过了一 ...

  • 结合JDK源码看设计模式——迭代器模式

    前言: Iterator翻译过来就是迭代器的意思.在前面的工厂模式中就介绍过了iterator,不过当时介绍的是方法,现在从Iterator接口的设计来看,似乎又是一种设计模式,下面我们就来讲讲迭代器 ...

  • PHP设计模式之迭代器模式

    PHP设计模式之迭代器模式 一说到这个模式,就不得不提循环语句.在<大话设计模式>中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得.任何语 ...

  • [PHP小课堂]PHP设计模式之迭代器模式

    [PHP小课堂]PHP设计模式之迭代器模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料