1.1概述

提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露对象的内部表示。这就是迭代器模式的定义。

合理组织数据的结构以及相关操作是程序设计的一个重要方面,比如在程序设计中经常会使用诸如链表、散列表等数据结构。链表和散列表等数据结构都是可以存放若干个对象的集合,其区别是按照不同的方式进行存储对象。我们希望无论何种集合,应当允许程序以一种统一的方式遍历集合中的对象,而不需要知道这些对象在集合中是如何表达及存储的。

例如,一栋楼中居住着张三、李四、王五三个人,分别被安排在不同的房间,张三知道李四的房间,李四知道王五的房间。假如有一个警察,他并不知道他们三个是如何居住的,只想找到他们,那么警察可以用一个next()方法找人,该方法的特点是在找到一个人的同时立刻让这个人说出他知道的下一个人的房间,然后警察再调用next()方法找到下一个人。如果警察调用next()方法首先找到张三,就可以依次找到李四和王五,具体如图一所示:

图一:警察找人

迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个称作迭代器的对象。比如,前面所述的楼就是一个集合,其中的人就是集合中的对象,而警察就是一个迭代器。

1.2模式的结构

迭代器模式的结构中包括四种角色:

(1)集合(Aggregate):一个接口,规定了具体集合需实现的操作。

(2)具体集合(ConcreteAggregate):具体集合是实现集合接口的类的实例,具体集合按照一定的结构存储对象。具体集合应当有一个方法,该方法返回一个针对该集合的具体迭代器。

(3)迭代器(Iterator):一个接口,规定了遍历集合的方法,比如next()方法。

(4)具体迭代器(ConcreteIterator):实现迭代器接口的类的实例,具体迭代器在实现迭代器接口所规定的遍历集合的方法时,比如next()方法,要保证next()方法的首次调用即按照集合的数据结构找到该集合中的一个对象,而且每当找到集合中的一个对象,立刻根据该集合的存储结构得到待遍历的后继对象的引用,并保证依次调用next()方法可以遍历集合。

迭代器模式结构的类图如下图二所示:

图二:迭代器模式类图

1.3迭代器模式的优点

(1)用户使用迭代器模式访问集合中的对象,而不需要知道这些对象在集合中是如何表达及存储的。

(2)用户可以同时使用多个迭代器遍历一个集合。

1.4适合使用迭代器模式的情景

(1)让用户访问一个集合中对象,但不想暴露对象在集合中的存储结构。

(2)希望对遍历不同的集合提供一个统一的接口。

1.5迭代器模式的使用

以下通过一个简单的问题讲述迭代器模式中所涉及的各个角色。

用一种集合模拟保险箱,该集合用返回的迭代器模拟点钞机。具体如下:

(1)集合(Aggregate)

在这里使用java.util包中的Collection接口作为模式中的集合角色。Java所有的集合都实现了该接口。

(2)具体集合(ConcreteAggregate)

在这里使用java.util包中的HashSet类的实例作为模式中的具体集合角色。

需要注意的是,在JDK1.5之后,要使用泛型,即使用HashSet<E>类(E是一个泛型)来创建一个集合对象。在使用HashSet<E>创建一个集合时,必须指定E的具体类型,即指定集合中存放的对象的具体类型,例如:

HashSet<String> set = new HashSet<String>();

那么,该集合set只可以存放String对象的引用,比如:

Set.add(“OK”);

向集合set中添加元素,该元素中存放者”OK”对象的引用,但是:

Set.add(new java.awt.Button());就是一个非法操作。

(3)迭代器(Iterator)

在本问题中,使用的迭代器是java.util包中的Iterator接口,该接口有:

Boolean hashNext()

Object next()

Void remove()

三个方法。迭代器通过next()方法依次返回集合中的对象,通过调用hashNext()方法判断集合中是否还有对象未被next()方法返回,调用remove()方法从集合中删除最近一次调用next()方法返回的对象。

(4)具体迭代器

HashSet创建的集合可以使用iterator()方法返回一个实现Iterator接口类的实例,即一个具体迭代器。

(5)具体使用

通过EightApllication类来具体实现上述相关类和接口,来实现适配器模式的运用,其代码如下:

package com.liuzhen.eight_iterator;import java.util.*;public class EightApplication {public static void main(String args[]){int n = 20;int sum = 0;Collection<Money> set =  new HashSet<Money>();   //集合对象for(int i = 0;i <= n;i++){if(i == n/2 || i == n/5 || i == n/6)set.add(new Money(100,false));elseset.add(new Money(100,true));}Iterator<Money> iterator = set.iterator();   //迭代器System.out.println("保险箱共有"+set.size()+"张人民币");int k = 0;while(iterator.hasNext()){Money money = iterator.next();k++;if(money.getIsTrue() == false){System.out.println("第"+k+"张是假币,被销毁");iterator.remove();k++;}}System.out.println("保险箱现有真人民币"+set.size()+"张,总价值是:");iterator = set.iterator();while(iterator.hasNext()){Money money = iterator.next();sum = sum+money.getValue();}System.out.println(sum+"元");}
}

相关类Money.java代码如下:

package com.liuzhen.eight_iterator;public class Money {int value;private boolean isTrue;Money(int value , boolean isTrue){this.value = value;this.isTrue = isTrue;}public boolean getIsTrue(){return isTrue;}public int getValue(){return value;}
}

运行结果:

保险箱共有21张人民币
第4张是假币,被销毁
第10张是假币,被销毁
第18张是假币,被销毁
保险箱现有真人民币18张,总价值是:
1800元

参考资料:

      1.Java设计模式/耿祥义,张跃平著.——北京:清华大学出版社,2009.5

设计模式学习笔记(八:迭代器模式)相关推荐

  1. 设计模式学习笔记——访问者(Visitor)模式

    设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...

  2. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

  3. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  4. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  5. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  6. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  7. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

  8. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  9. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  10. 设计模式学习笔记——组合(Composite)模式

    设计模式学习笔记--组合(Composite)模式 @(设计模式)[设计模式, 组合模式, composite] 设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Ent ...

最新文章

  1. UITextField的详细使用
  2. 为什么python不报错不出结果_python的坑货ConfigParser类读取文件失败不报错
  3. 开始学习吧,《算法》:动态连通性练习
  4. 数据科学家技能地铁图
  5. 机器学习——逻辑回归算法
  6. git reset revert 回退回滚取消提交返回上一版本
  7. 模板方法模式(TemplateMethod) 简介
  8. Visual Studio2017 远程调试 Remote Debugger
  9. (转)基于svnserve的服务器,权限文件authz配置的常见问题及解答
  10. 带你学习ES5中新增的方法
  11. struts2+spring 项目中配置tiles的解决方案
  12. Python 查询 MAC 地址相关信息
  13. ZigBee与Android的智能家居控制系统设计
  14. 单片机中断原理及定时器详解
  15. 全国计算机四六级报名时间,2018年6月四六级考试报名即将截止,请抓紧时间报名!...
  16. PM2.5的加重,和建筑工地关系大不大?(附扬尘治理方案)
  17. 帝国模板变量更新后页面不更新
  18. CodeBlocks编译环境配置及调试问题
  19. mysql筛选向导怎么用_Navicat筛选向导
  20. Flask Web实战-新闻资讯项目

热门文章

  1. 怎样找出插件的api地址_百度云盘免登陆高速下载,调用度云简易分享地址提取在线工具...
  2. mx3 android 5.1,魅族MX3揭晓:猎户座处理器5.1寸屏幕
  3. 可以作为python字符串常量的是_Python 复习
  4. HDLBits 系列(22) Shift register
  5. 入门架构——单机高性能
  6. Java的新项目学成在线笔记-day8(三)
  7. JAVA面向对象的总结(函数重载与数组)
  8. 模拟信号可以传输声音和图像,那么文字呢--信息论系列
  9. spring aop 拦截业务方法,实现权限控制
  10. AT+CSMP 设置短消息文本参数