[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) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透 ...
随机推荐
- android 复制字符串到剪贴板
public static void CopyToClipboard(Context context,String text){ ClipboardManager clip = (ClipboardM ...
- openstack想说爱你不容易
网上一牛人的博客专门写的是关于openstack的,看晕了.先收藏下.猛击下面的地址 http://www.cnblogs.com/popsuper1982/
- Windows共享作为公司文件服务器的案例
1.目录结构 → 主管 部门 → 员工 → Public 2.实现效果 每个部门一个目录 部门主管可以访问自己和部门员工的目录 部门员工只可访问自己的目录 公共目录Public部门所有人都可访问 3. ...
- [WPF系列]-Layout
DockPanel The nice thing about dock panels is they already fill all the available space. LastChildFi ...
- [WPF系列]基础Combox
示例 参考 WPF combobox SelectedValue binding to string Confused with wpf ComboBox DisplayMemberPath, ...
- Asp.Net Core 简单的使用加密的Cookie保存用户状态
在以前的Asp.Net中可以用 FormsAuthentication 类的一系列方法来使用加密的Cookie存储用户身份,使用简单,可控性强.在Asp.Net Core中是否也可以的?答案是当然的. ...
- HDU3555 Bomb[数位DP]
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- 字符加密Cipher(bzoj 1031)
Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...
- OllyUni.dll
OllyUni.dll 周银辉 好像很多人找不到OllyUni.dll ,下载在这里:http://www.phenoelit.org/win/index.html 注:在OllyDBG2.0中用不了 ...
- [转]Mac下配置基于SecurID的Cisco IPSec VPN全攻略(有图)
来自: http://www.eefocus.com/Kevin/blog/11-09/230878_53c71.html RSA的SecurID长的是这个样子滴: Mac里面,可以设置VPN, 方法 ...