系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

[Head First设计模式]山西面馆中的设计模式——建造者模式

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]一个人的平安夜——单例模式

[Head First设计模式]抢票中的设计模式——代理模式

[Head First设计模式]面向对象的3特征5原则

[Head First设计模式]鸭子模型——策略模式

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

[Head First设计模式]餐馆中的设计模式——命令模式

[Head First设计模式]身边的设计模式——适配器模式

迭代器模式

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

类图

角色

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

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

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

ConcreteAggregate:具体聚合,其工作是实现相应迭代器的接口,返回具体迭代器的一个适当的实例。

适用场景

1,访问一个聚合对象的内容而无需暴露它的内部表示

2,支持对聚合对象的多种遍历

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

优缺点

优点:

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

2,简化了聚合的接口

3,可同时进行多个遍历

缺点:

和集合密切相关,限制了其广泛使用。

一个例子

公共汽车售票员工作的场景:

售票员不管上来的是人还是行李,不管是中国人还是外国人,不管是内部员工还是别的,只要是来乘车的乘客,就必须要买票。也就是说,当我们需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代模式。

另外,售票员从车头到车尾来售票,也可以从车尾向车头来售票,也就是说,当我们需要对聚集有很多种方式遍历时,可以考虑用迭代器模式。

由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个,是否结束,当前售到那一个人,这些方法每天他都在做,也就是说,当遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的过程,可以考虑使用迭代器模式。

这里使用IEnumerator,.net中的迭代器接口

  1. namespace System.Collections
  2. {
  3. // 摘要:
  4. // 支持对非泛型集合的简单迭代。
  5. [ComVisible(true)]
  6. [Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
  7. public interface IEnumerator
  8. {
  9. // 摘要:
  10. // 获取集合中的当前元素。
  11. //
  12. // 返回结果:
  13. // 集合中的当前元素。
  14. object Current { get; }
  15.  
  16. // 摘要:
  17. // 将枚举数推进到集合的下一个元素。
  18. //
  19. // 返回结果:
  20. // 如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。
  21. //
  22. // 异常:
  23. // System.InvalidOperationException:
  24. // 在创建了枚举数后集合被修改了。
  25. bool MoveNext();
  26. //
  27. // 摘要:
  28. // 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
  29. //
  30. // 异常:
  31. // System.InvalidOperationException:
  32. // 在创建了枚举数后集合被修改了。
  33. void Reset();
  34. }
  35. }

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

  1. namespace Wolfy.迭代器模式
  2. {
  3. public class Concretelterator : IEnumerator
  4. {
  5. private ConcreteAggregate aggregate;
  6. private int currentIndex=-;
  7. public Concretelterator(ConcreteAggregate aggregate)
  8. {
  9. this.aggregate = aggregate;
  10. }
  11. public object Current
  12. {
  13. get { return aggregate[currentIndex]; }
  14. }
  15.  
  16. public bool MoveNext()
  17. {
  18. currentIndex++;
  19. return currentIndex < this.aggregate.Count;
  20.  
  21. }
  22.  
  23. public void Reset()
  24. {
  25. currentIndex = -;
  26. }
  27. }
  28. }
  1. namespace Wolfy.迭代器模式
  2. {
  3. public abstract class Aggregate
  4. {
  5. public abstract IEnumerator CreateEnumerator();
  6. }
  7. }

ConcreteAggregate:具体聚合,其工作是实现相应迭代器的接口,返回具体迭代器的一个适当的实例。

  1. namespace Wolfy.迭代器模式
  2. {
  3. public class ConcreteAggregate : Aggregate
  4. {
  5. private ArrayList arr=new ArrayList();
  6. public int Count
  7. {
  8. get { return arr.Count; }
  9. }
  10. public object this[int index]
  11. {
  12. get { return arr[index]; }
  13. set { arr.Insert(index, value); }
  14. }
  15. public override System.Collections.IEnumerator CreateEnumerator()
  16. {
  17. return new Concretelterator(this);
  18. }
  19. }
  20. }

测试

  1. namespace Wolfy.迭代器模式
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7.  
  8. ConcreteAggregate agg = new ConcreteAggregate();
  9. agg[] = "乘客1";
  10. agg[] = "乘客2";
  11. agg[] = "乘客3";
  12. agg[] = "乘客4";
  13. agg[] = "乘客5";
  14. agg[] = "乘客6";
  15. agg[] = "乘客7";
  16. agg[] = "乘客8";
  17. agg[] = "乘客9";
  18. agg[] = "乘客10";
  19. IEnumerator iterator =agg.CreateEnumerator();
  20. while (iterator.MoveNext())
  21. {
  22. Console.WriteLine(iterator.Current);
  23. }
  24. iterator.Reset();
  25. Console.Read();
  26. }
  27. }
  28. }

结果:

总结

这个模式给你提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。

参考书:

《Head First 设计模式》

[Head First设计模式]生活中学设计模式——迭代器模式的更多相关文章

  1. [Head First设计模式]生活中学设计模式——组合模式

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

  2. [Head First设计模式]生活中学设计模式——外观模式

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

  3. [Head First设计模式]生活中学设计模式——状态模式

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

  4. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  5. Javascript设计模式之我见:迭代器模式

    大家好!本文介绍迭代器模式及其在Javascript中的应用. 模式介绍 定义 提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 类图及说明 Iterator抽象迭代器 抽象迭代器负 ...

  6. C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...

  7. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看.“迭代器模式”我第一次看到这个名称,我的理解 ...

  8. C#设计模式(15)——迭代器模式

    1.迭代器模式介绍 迭代器模式主要用于遍历聚合对象,将聚合对象的遍历行为分离出来,抽象为一个迭代器来负责.迭代器模式用的十分普遍,C#/JAVA等高级语言都对迭代器进行了封装用于遍历数组,集合,列表等 ...

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

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

随机推荐

  1. day1学习

    python 2 和 3 的区别 1.用户输入的命令:python 2 中是raw_input(""):python 3 中是input(""). 2.默认字符 ...

  2. NAS硬盘损坏拷贝时的处理办法及 UBUNTU下遍历删除某目录的方法

    NAS突然挂了,说是硬盘坏了,我不信呀,换块上去先.原来的硬盘要经过一定的操作才能使用 官方给出的解决方案:我如何使用电脑来还原存储在 DiskStation 中的数据? 然后,你再拷贝到新的NAS中 ...

  3. JSCH通过密钥文件进行远程访问

    需求:WEB app 需要使用JSCH来通过密钥文件的方式进行SFTP/SSH访问远程LINUX机器 实现方式:假设远程机器都含有用户名为hadoop的用户,因为密码因为策略的要求密码会随时间发生变化 ...

  4. CI连接多个数据库

    参考http://codeigniter.org.cn/user_guide/database/connecting.html手册 首先,在database.php中设置多个数据库的连接信息,这里命名 ...

  5. CF219D. Choosing Capital for Treeland [树形DP]

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...

  6. 洛谷P1156 垃圾陷阱[背包DP]

    题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...

  7. Metasploit爆破tcpwrapped服务

    转自:http://www.mamicode.com/info-detail-1653722.html 一.利用nmap工具扫描目标主机 1.1 使用nmap命令对目标主机进行扫描. 1.2 在终端中 ...

  8. Good Bye 2016 //智商再次下线,边界爆炸.....

    A B很水就略了.. C.又是一次wannafly一样的判断区间的.....  边界设为2000000  正好GG...... fst的时候立马想到上次也是这么wa过的...... 所以下次遇到这种题 ...

  9. select,poll,epoll比较

    除常用文件i/o外,其他常用io模型:io多路复用(select和poll系统调用)信号驱动I/Olinux专有的epoll编程接口异步io(aio),linux在glibc中提供有基于线程的 pos ...

  10. 自定义ViewGroup初步探究

    由于项目需要,实现类似于地图控件,能够让一张图标自由缩放并且在其上固定位置,标记一些地点,所以在这里,我考虑了一下,决定使用自定义ViewGroup来实现.