设计模式(16)——迭代器模式(Iterator Pattern)
2016-03-03 11:32
531 查看
一、引言
在上篇博文中分享了我对命令模式的理解,命令模式主要是把行为进行抽象成命令,使得请求者的行为和接受者的行为形成低耦合。在一章中,将介绍一下迭代器模式。下面废话不多说了,直接进入本博文的主题。二、迭代器模式的介绍
迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的话,集合对象就承担太多的责任了,面向对象设计原则中有一条是单一职责原则,所以我们要尽可能地分离这些职责,用不同的类去承担不同的职责。迭代器模式就是用迭代器类来承担遍历集合元素的职责。2.1 迭代器模式的定义
迭代器模式提供了一种方法顺序访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。2.2 迭代器模式的结构
既然,迭代器模式承担了遍历集合对象的职责,则该模式自然存在2个类,一个是聚合类,一个是迭代器类。在面向对象涉及原则中还有一条是针对接口编程,所以,在迭代器模式中,抽象了2个接口,一个是聚合接口,另一个是迭代器接口,这样迭代器模式中就四个角色了,具体的类图如下所示:从上图可以看出,迭代器模式由以下角色组成:
迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口
具体迭代器角色(Concrete Iteraror):具体迭代器角色实现了迭代器接口,并需要记录遍历中的当前位置。
聚合角色(Aggregate):聚合角色负责定义获得迭代器角色的接口
具体聚合角色(Concrete Aggregate):具体聚合角色实现聚合角色接口。
2.3 迭代器模式的实现
介绍完迭代器模式之后,下面就具体看看迭代器模式的实现,具体实现代码如下:三、.NET中迭代器模式的应用
在.NET下,迭代器模式中的聚集接口和迭代器接口都已经存在了,其中IEnumerator接口扮演的就是迭代器角色,IEnumberable接口则扮演的就是抽象聚集的角色,只有一个GetEnumerator()方法,关于这两个接口的定义可以自行参考MSDN。在.NET 1.0中,.NET 类库中很多集合都已经实现了迭代器模式,大家可以用反编译工具Reflector来查看下mscorlib程序集下的System.Collections命名空间下的类,这里给出ArrayList的定义代码,具体实现代码可以自行用反编译工具查看,具体代码如下所示:四、迭代器模式的适用场景
在下面的情况下可以考虑使用迭代器模式:系统需要访问一个聚合对象的内容而无需暴露它的内部表示。
系统需要支持对聚合对象的多种遍历。
系统需要为不同的聚合结构提供一个统一的接口。
五、迭代器模式的优缺点
由于迭代器承担了遍历集合的职责,从而有以下的优点:迭代器模式使得访问一个聚合对象的内容而无需暴露它的内部表示,即迭代抽象。
迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作
迭代器模式存在的缺陷:
迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常。所以使用foreach语句只能在对集合进行遍历,不能在遍历的同时更改集合中的元素。
六、总结
到这里,本博文的内容就介绍结束了,迭代器模式就是抽象一个迭代器类来分离了集合对象的遍历行为,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。在一篇博文中将为大家介绍观察者模式。相关文章推荐
- DIV+CSS的命名规则
- Android清单文件具体解释(三)----应用程序的根节点<application>
- 总结ing
- Swift2.0(17)内存管理ARC
- IIS7.5下的web.config 404 配置
- 配置PostgreSQL数据库流复制(replication stream)环境
- ValueStack、OGNL和Struts2标签
- 动态顺序表
- 一早起来发现自己没有写昨天的三道DP(Flag被收系列)
- [FAQ17435]插入两张卡,选择总是询问。非常快速的连续点击“快速拨号、最近、联系人”正上方的最近联系人,进行拨号,出现一次“拨号失败,已超过限制”后,就一直不能拨号。
- 设计模式(15)——命令模式(Command Pattern)
- 金蝶EAS常用表
- Oracle手工创建数据库
- <php>对文件的目录、属性、路径的操作
- Android SQLite (三 ) 全面详解(一)
- Leetcode:263. Ugly Number(JAVA)
- Swift2.0(16)分类与协议
- 从HashMap到LruCache的源码分析
- [FAQ02895]【call】在通话过程中,一直靠近距离传感器。通话结束时,要求马上点亮屏幕
- 设计模式(14)——模板方法模式(Template Method)