1 意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

2 别名(Cursor)

3 动机:队列表的访问和遍历从列表对象中分离出来放入一个迭代器对象中。

  多态迭代

  抽象的列表类,提供列表的公共接口。类似的也需要一个抽象的Iterator,公共的迭代接口。

列表对象提供CreateIterator(是Factory Method)

4 适用性:

.访问聚合对象内容而无需暴露它的内部表示

.支持该聚合对象的多种遍历

.为遍历不同的聚合结构提供一个统一的接口(支持多台迭代)

5 参与者:

Iterator:定义访问和遍历元素的接口

ConcreteIterator:具体迭代器实现迭代的接口。对聚合遍历时跟踪当前位置。

Aggregate:聚合定义创建相应迭代器对象的接口

ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

6 ConcreteIterator 跟踪聚合中的当前对象,能计算出遍历的后继对象。

7 效果:

1)支持不同的方式遍历一个聚合

2)简化了聚合的接口

3)同一个聚合上可以有多个遍历

8 实现:

1)谁控制迭代

客户控制迭代时,外部迭代器。客户主动请求下一个元素

迭代器控制迭代时,内部迭代器。客户只需要指定一个有待执行的操作

2)谁定义算法遍历:

3)迭代器的健壮程度如何:

遍历迭代器的同时更改迭代器是危险的。

4)附加迭代的操作

5)C++中使用多台的迭代器:

要求使用Factory Method动态分配迭代器对象。缺点:客户必须删除迭代器。

Proxy提供了一个补救方法。可以使用一个栈分配的Proxy作为实际迭代器的代理。在Proxy的析构函数里删除迭代器。

6)迭代器可有特权访问:

迭代器作为聚合的友元,这样就是紧密的耦合。

特权遍历使得生成新的遍历很困难,因为要求聚合增加友元。

解决办法,迭代器类包含protected操作访问聚合类的重要的非公共可见的成员,迭代器子类可使用protected操作得到聚合的特权访问。

7)用于复合对象的迭代器:

Composite模式,使用内部迭代器更方便一些。

如果复合对象有一个接口从一个节点移到父节点、兄弟节点或子节点,那么基于游标的迭代器更好。

8)空迭代器:

NullIterator是一个退化的迭代器,有助于处理外部边界。

ITERATOR(迭代器)设计模式的更多相关文章

  1. Design Pattern Iterator 迭代器设计模式

    这个设计模式感觉很easy,我们平时敲代码的时候也是常常须要调用iterator的,C++和Java都是. 所以感觉没什么特别的.就是须要模仿C++或者Java的iterator类的功能吧. 这里简单 ...

  2. [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

  3. [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

  4. 使用C# (.NET Core) 实现迭代器设计模式 (Iterator Pattern)

    本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设 ...

  5. 设计模式17:Iterator 迭代器模式(行为型模式)

    Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透 ...

  6. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  7. 【转】Java学习之Iterator(迭代器)的一般用法 (转)

    [转]Java学习之Iterator(迭代器)的一般用法 (转) 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭 ...

  8. 用C# (.NET Core) 实现迭代器设计模式

    本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设 ...

  9. ES6笔记(6)-- Set、Map结构和Iterator迭代器

    系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...

  10. vector容器+iterator迭代器

    关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm   关于iterator迭代器的描述,可参考http://www.cppblog.c ...

随机推荐

  1. awk用法小结(作者总结)

    http://www.chinaunix.net/old_jh/24/691456.html http://wenku.baidu.com/view/ebac4fc658f5f61fb736664d. ...

  2. Poj(3259),SPFA,判负环

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  3. php使用 set_include_path

    通过set_include_path引用home/lib/image.func.php 1.创建include.php 2.添加如下代码 3.在需要引用的文件中包含include.php文件 < ...

  4. Android WebView中的JavaScript代码使用

    在WebView中使用JavaScript 如果你想要载入的页面中用了JavaScript,你必须为你的WebView使能JavaScript. 一旦使能之后,你也可以自己创建接口在你的应用和Java ...

  5. Maven仓库的理解及配置

    什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文 件,如log4j.jar,junit. ...

  6. 解决Bootstrap 附加导航(Affix)的问题和使用时若干注意事项

    1.要清楚Affix分别赋予的class, 开始:affix-top 达到top参数:affix 达到bottom参数:affix-bottom 2.一定要自定义这些class,否则 插件会默认给你在 ...

  7. 二、java中的基本数据类型

    总结: 1.java中的基本数据类型有byte.short.int.long;float.double;char;boolean. 2.基本数据类型与1相对应分别占1.2.4.8;4.8;2;1.(单 ...

  8. windows下的mysql客户端mysqlworkbench链接虚拟机上CentOS的mysql服务器

    本人在虚拟机上CentOS的Linux环境下安装了mysql服务器,在本地Windows下安装了mysql的客户端mysqlworkbench ,所以就想让windows下的mysql客户端mysql ...

  9. BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: i ...

  10. 【转载】Linux系统启动流程

    原文:Linux系统启动流程 POST(Power On Self Test/上电自检)-->BootLoader(MBR)-->Kernel(硬件探测.加载驱动.挂载根文件系统./sbi ...