[Head First设计模式]生活中学设计模式——迭代器模式
系列文章
[Head First设计模式]山西面馆中的设计模式——装饰者模式
[Head First设计模式]山西面馆中的设计模式——观察者模式
[Head First设计模式]山西面馆中的设计模式——建造者模式
[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
[Head First设计模式]抢票中的设计模式——代理模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]餐馆中的设计模式——命令模式
[Head First设计模式]身边的设计模式——适配器模式
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
类图

角色
Iterator:定义访问和遍历元素的接口
Concretelterator:具体迭代器,实现迭代器接口,对该聚合遍历时跟踪当前位置。
Aggregate:聚合,定义创建相应迭代器对象的接口。
ConcreteAggregate:具体聚合,其工作是实现相应迭代器的接口,返回具体迭代器的一个适当的实例。
适用场景
1,访问一个聚合对象的内容而无需暴露它的内部表示
2,支持对聚合对象的多种遍历
3,为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代)
优缺点
优点:
1,支持以不同的方式遍历一个聚合
2,简化了聚合的接口
3,可同时进行多个遍历
缺点:
和集合密切相关,限制了其广泛使用。
一个例子
公共汽车售票员工作的场景:
售票员不管上来的是人还是行李,不管是中国人还是外国人,不管是内部员工还是别的,只要是来乘车的乘客,就必须要买票。也就是说,当我们需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代模式。
另外,售票员从车头到车尾来售票,也可以从车尾向车头来售票,也就是说,当我们需要对聚集有很多种方式遍历时,可以考虑用迭代器模式。
由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个,是否结束,当前售到那一个人,这些方法每天他都在做,也就是说,当遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的过程,可以考虑使用迭代器模式。
这里使用IEnumerator,.net中的迭代器接口
namespace System.Collections
{
// 摘要:
// 支持对非泛型集合的简单迭代。
[ComVisible(true)]
[Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
{
// 摘要:
// 获取集合中的当前元素。
//
// 返回结果:
// 集合中的当前元素。
object Current { get; } // 摘要:
// 将枚举数推进到集合的下一个元素。
//
// 返回结果:
// 如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。
//
// 异常:
// System.InvalidOperationException:
// 在创建了枚举数后集合被修改了。
bool MoveNext();
//
// 摘要:
// 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
//
// 异常:
// System.InvalidOperationException:
// 在创建了枚举数后集合被修改了。
void Reset();
}
}
Concretelterator:具体迭代器,实现迭代器接口,对该聚合遍历时跟踪当前位置。
namespace Wolfy.迭代器模式
{
public class Concretelterator : IEnumerator
{
private ConcreteAggregate aggregate;
private int currentIndex=-;
public Concretelterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
public object Current
{
get { return aggregate[currentIndex]; }
} public bool MoveNext()
{
currentIndex++;
return currentIndex < this.aggregate.Count; } public void Reset()
{
currentIndex = -;
}
}
}
namespace Wolfy.迭代器模式
{
public abstract class Aggregate
{
public abstract IEnumerator CreateEnumerator();
}
}
ConcreteAggregate:具体聚合,其工作是实现相应迭代器的接口,返回具体迭代器的一个适当的实例。
namespace Wolfy.迭代器模式
{
public class ConcreteAggregate : Aggregate
{
private ArrayList arr=new ArrayList();
public int Count
{
get { return arr.Count; }
}
public object this[int index]
{
get { return arr[index]; }
set { arr.Insert(index, value); }
}
public override System.Collections.IEnumerator CreateEnumerator()
{
return new Concretelterator(this);
}
}
}
测试
namespace Wolfy.迭代器模式
{
class Program
{
static void Main(string[] args)
{ ConcreteAggregate agg = new ConcreteAggregate();
agg[] = "乘客1";
agg[] = "乘客2";
agg[] = "乘客3";
agg[] = "乘客4";
agg[] = "乘客5";
agg[] = "乘客6";
agg[] = "乘客7";
agg[] = "乘客8";
agg[] = "乘客9";
agg[] = "乘客10";
IEnumerator iterator =agg.CreateEnumerator();
while (iterator.MoveNext())
{
Console.WriteLine(iterator.Current);
}
iterator.Reset();
Console.Read();
}
}
}
结果:
总结
这个模式给你提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。
参考书:
《Head First 设计模式》
[Head First设计模式]生活中学设计模式——迭代器模式的更多相关文章
- [Head First设计模式]生活中学设计模式——组合模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]生活中学设计模式——外观模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]生活中学设计模式——状态模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- Javascript设计模式之我见:迭代器模式
大家好!本文介绍迭代器模式及其在Javascript中的应用. 模式介绍 定义 提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 类图及说明 Iterator抽象迭代器 抽象迭代器负 ...
- C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...
- C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看.“迭代器模式”我第一次看到这个名称,我的理解 ...
- C#设计模式(15)——迭代器模式
1.迭代器模式介绍 迭代器模式主要用于遍历聚合对象,将聚合对象的遍历行为分离出来,抽象为一个迭代器来负责.迭代器模式用的十分普遍,C#/JAVA等高级语言都对迭代器进行了封装用于遍历数组,集合,列表等 ...
- 设计模式17:Iterator 迭代器模式(行为型模式)
Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透 ...
随机推荐
- TAR,JAR,Zip的使用
在文件归档的时候,LINUX中,我常喜欢使用tar,它可以把一个文件夹归档为一个文件,可以同时使用指定的压缩算法把其压缩归档. 最常用的语句是: tar cvzf target.tar.gz sour ...
- HTTPS简述
Https是什么? HTTPS是Http Over SSL,简单来说就是HTTP的安全版本,在http之上使用TLS,SSL加密协议. HTTPS实质是在HTTP基础上使用非对称加密相互生成并传递对称 ...
- Apache、nginx配置的网站127.0.0.1可以正常访问,内外网的ip地址无法访问,谁的锅?
最近做开发,发现一个比较尴尬的问题.因为我是一个web开发者,经常要用到Apache或者nginx等服务器软件,经过我测试发现,只要我打开了adsafe,我便不能通过ip地址访问我本地的网站了,比如我 ...
- 概率dp学习
预备知识 一.期望的数学定义 如果X 是一个离散的随机变量,输出值为 x1, x2, ..., 和输出值相应的概率为p1, p2, ... (概率和为 1), 那么期望值为E(x)=x1p1+x2p2 ...
- iOS 2D绘图 (Quartz2D)之路径(stroke,fill,clip,subpath,blend)
像往常一样 这个系列的博客是跟着大神的脚步来的.按照往例 在此贴出原博客的出处: http://blog.csdn.net/hello_hwc?viewmode=list我对大神的崇拜之情 如滔滔江水 ...
- Understanding Binomial Confidence Intervals 二项分布的置信区间
Source: Sigma Zone, by Philip Mayfield The Binomial Distribution is commonly used in statistics in a ...
- Reverse Nodes in k-Group
Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time and ret ...
- Android 图文数据JSON解析,金山词霸每日一句API的调用
金山词霸开发的免费API http://open.iciba.com/dsapi/ 数据格式为 {","name":"\u7535\u5f71\u7ecf\u5 ...
- Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...
- 如何重复使用IEnumerable对象来枚举?
我在2011年9月发表了一个问问,http://q.cnblogs.com/q/28679/. 没人理我. 自己看了一下,尝试自己解决: 原问题: MSDN: 在非泛型集合中,您可以在调用 Reset ...