1.定义

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。
简单来说:迭代器模式就是提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

2.概述

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

3.应用场景

1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。
3、为遍历不同的聚合结构提供一个统一的接口。

4.模式的结构与使用

迭代器模式的结构中包括四种角色。
集合(Aggregate): 一个接口,规定了具体集合需实现的操作。
具体集合(ConcreteAggregate): 具体集合是实现集合接口类的实例,具体集合按照一定结构存储对象。具体集合应当有一个方法,该方法返回一个针对该集合的具体迭代器。
迭代器(Iterator): 一个接口,规定了遍历具体集合的方法,比如next()方法.
具体迭代器(ConcreteIterator): 实现了迭代器接口的类的实例。具体迭代器在实现迭代器接口所规定的遍历集合的方法时,比如next()方法,要保证next()方法的首次调用将按着集合的数据结构找到该集合中的一个对象,而且每当找到集合中的一个对象,立刻根据该集合的存储结构得到待遍历的后继对象的引用,并保证一次调用next()方法可以遍历集合。

1.迭代器模式的UML类图

2.结构的描述

以下通过一个简单的问题讲述迭代器模式中所涉及的各个角色。
用一种集合模拟保险箱,该集合用返回的迭代器模拟点钞机。
1.集合(Aggregate)
这里使用java.util包中的Collection接口作为模式中的集合角色。Java所有的单例集合都实现了该接口。
2.具体集合(ConcreteAggregate)
在这里使用java.util包中的ArrayList类的实例作为模式中的具体集合角色。
需要注意的是,在JDK1.5之后,要使用泛型,即使用ArrayList类(E是一个泛型)来创建一个集合对象。在使用ArrayList创建一个集合时,必须要指定E的具体类型,即指定集合中存放的对象的具体类型,例如:

Collection<RenMinMoney> set=new ArrayList<>();//定义集合对象

具体的集合继承关系如下图所示:

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

boolean hasNext();
Object next();
void remove();

三个方法。迭代通过调用next()方法依次返回集合中的对象,通过调用hasNext()方法判断集合中是否还有对象未被next()方法返回,调用remove()方法从集合中删除最近一次调用next()方法返回的对象。
4.具体迭代器
HashSet创建的集合可以使用iterator()方法返回一个实现Iterator接口类的实例,即一个具体的迭代器。
5.测试程序

package com.xing.Iterator;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class Application {public static void main(String[] args) {int n=20;int sum=0;Collection<RenMinMoney> set=new ArrayList<>();//定义集合对象for (int i = 1; i <=n; i++) {if(i==n/2 || i==n/5 || i==n/6){set.add(new RenMinMoney(100,false));//模拟定义假币}else{set.add(new RenMinMoney(100,true));}}Iterator<RenMinMoney> iterator = set.iterator();//获得具体迭代器System.out.println("保险箱共有"+set.size()+"张人民币");int k=0;while(iterator.hasNext()){RenMinMoney money = iterator.next();k++;if(!money.isTrue()){System.out.println("第"+k+"张是假币,已被销毁");iterator.remove();}}System.out.println("保险箱现有真人民币"+set.size()+"张,总价值是:");iterator = set.iterator();while (iterator.hasNext()){RenMinMoney money = iterator.next();sum+=money.getValue();}System.out.println(sum+"元");}
}
class RenMinMoney{int value;private boolean isTrue;public RenMinMoney(int value, boolean isTrue) {this.value = value;this.isTrue = isTrue;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}public boolean isTrue() {return isTrue;}public void setTrue(boolean aTrue) {isTrue = aTrue;}
}

6.测试结果展示

5.迭代器模式的优点

1.用户使用迭代器访问集合中的对象,而不需要知道这些对象在集合中是如何表示及存储的。
2.用户可以同时使用多个迭代器遍历一个结集合。

设计模式:(迭代器模式)相关推荐

  1. java设计模式迭代器模式_迭代器设计模式示例

    java设计模式迭代器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式 ...

  2. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  3. java设计模式迭代器模式_迭代器模式和Java

    java设计模式迭代器模式 大家好,在本文中,我们将检查Iterator Pattern . 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值. 根据&l ...

  4. java设计模式迭代器模式_Java中的迭代器设计模式

    java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...

  5. 23种设计模式-迭代器模式《三国名将》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部 ...

  6. [Head First设计模式]生活中学设计模式——迭代器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  7. Java设计模式——迭代器模式

    概述 网上大部分人说迭代模式的时候,总是以某一种可遍历的对象为例进行介绍.这是可行的,这也是迭代模式的基本原型.当我看到<Head Frist设计模式>中迭代模式的时候,感觉要是能从另一个 ...

  8. C++设计模式-迭代器模式

    目录 基本概念 代码与实例 基本概念 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 当你需要一个聚集对象,而且不管这些对象,而不管这些对象是 ...

  9. 解读设计模式----迭代器模式(Iterator Pattern),谁才是迭代高手

    一.你在开发中使用过迭代吗?      当你在使用JavaScript开发客户端应用的时候使用过for...in吗?  1<script type="text/javascript&q ...

  10. JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构 图-迭代器模式结构图 Iterator : 定义访 ...

最新文章

  1. 过年回家抢票不求人,试试这个开源抢票神器吧!
  2. virtualbox 创建桥接网络_Windows 10下的Virtualbox中的桥接网络不起作用
  3. javascript基础:函数参数与闭包问题
  4. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 16—Recommender Systems 推荐系统...
  5. 使用phantomjs操作DOM并对页面进行截图需要注意的几个问题
  6. python在mac上_在Mac上Python多版本切换
  7. Shell脚本中循环until命令用法笔记
  8. 抽象类的成员特点 学习笔记
  9. jQuery基础之jQuery和原生js实现tab选项卡和电影排行榜
  10. 【Mac】Mac通过反向代理连接内网(教育网)服务器 + 免密登陆
  11. jquery日历插件 途牛_js jquery 实现 排班,轮班,日历,日程。使用fullcalendar 插件...
  12. 实验二 语法分析1——递归子程序法
  13. windows的hosts文件在哪?
  14. 优锘科技:森数据初体验
  15. 腾讯云弹性微服务TEM
  16. rtklib-单点定位(pntpos.c)代码关键问题解析-satposs部分
  17. OpenLayers 3实践与原理探究3-ol3一个完整的例子
  18. Android Studio如何查看自己创建的SQLite数据库
  19. Spring boot + netty开发即时通讯 IM
  20. input标签type=“week“选择第几周

热门文章

  1. mysql实现自定义split函数
  2. vc_runtimeMinimum_x64.msi 找不到的解决方法microsoft
  3. cocos子节点转父节点坐标 原理浅析(局部坐标转世界坐标同理)
  4. 青蛙跳台问题(初级)
  5. 18年程序员退休后的第一篇文章:程序员推荐去的网站
  6. 【昇腾AI系列】 在200DK上安装MindX SDK
  7. 固态硬盘开机慢原因亲测
  8. BaiduMap---百度地图官方Demo之调用百度地图(介绍如何调启百度地图实现自身业务功能)
  9. 101 个 MySQL 的调节和优化的提示
  10. 【199】ArcGIS 添加自定义工具到工具箱