动机(Motivate):
    在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作”提供了可能。

使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方法。
意图(Intent):
   
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。-------《设计模式》GOF
结构图(Struct):
            
适用性:  

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

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

3.为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
生活中的例子:
    迭代器提供一种方法顺序访问一个集合对象中各个元素,而又不需要暴露该对象的内部表示。在早期的电视机中,一个拨盘用来改变频道。当改变频道时,需要手工转动拨盘移过每一个频道,而不论这个频道是否有信号。现在的电视机,使用[后一个]和[前一个]按钮。当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。


代码实现:
    在面向对象 的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部 的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职 责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。下面看一个简单的示意性例子,类结构图如下:
               
    首先有一个抽象的聚集,所谓的聚集就是就是数据的集合,可以循环去访问它。它只有一个方法GetIterator()让子类去实现,用来获得一个迭代器对象。

    /// <summary>/// 抽象聚焦/// </summary>interface IList{IIterator GetIterator();}

    抽象的迭代器,它是用来访问聚集的类,封装了一些方法,用来把聚集中的数据按顺序读取出来。通常会有MoveNext()、CurrentItem()、Fisrt()、Next()等几个方法让子类去实现。

    /// <summary>/// 抽象迭代器/// </summary>interface IIterator{bool MoveNext();Object CurrentItem();void First();void Next();}

具体的聚集,它实现了抽象聚集中的唯一的方法,同时在里面保存了一组数据,这里我们加上Length属性和GetElement()方法是为了便于访问聚集中的数据。

    /// <summary>///  具体聚集/// </summary>class ConcreteList : Interface.IList{int[] list;public ConcreteList(){list = new int[] { 1, 2, 3, 4, 5 };}public Interface.IIterator GetIterator(){return new ConcreteIterator(this);}public int Length{get { return list.Length; }}public int GetElement(int index){return list[index];}}

具体迭代器,实现了抽象迭代器中的四个方法,在它的构造函数中需要接受一个具体聚集类型的参数,在这里面我们可以根据实际的情况去编写不同的迭代方式。

    /// <summary>/// 具体迭代器/// </summary>class ConcreteIterator : Interface.IIterator{private ConcreteList list;private int index;public ConcreteIterator(ConcreteList list){this.list = list;this.index = 0;}public bool MoveNext(){if (index < list.Length){return true;}else{return false;}}public object CurrentItem(){return list.GetElement(index);}public void First(){index = 0;}public void Next(){if (index < list.Length){index++;}}}

简单的客户端程序调用:

    class Program{/// <summary>/// 客户端程序/// </summary>/// <param name="args"></param>static void Main(string[] args){Interface.IIterator iterator;Interface.IList list = new Class.ConcreteList();iterator = list.GetIterator();while (iterator.MoveNext()){int i = (int)iterator.CurrentItem();Console.WriteLine(i.ToString());iterator.Next();}Console.Read();}}

.NET中Iterator中的应用:
在.NET下实现Iterator模式,对于聚集接口和迭代器接口已经存在了,其中IEnumerator扮演的就是迭代器的角色,它的实现如下:

1 public interface IEumerator
 2 
 3 {
 4     object Current
 5     {
 6         get;
 7     }
 8 
 9     bool MoveNext();
10 
11     void Reset();
12 
13 }

属性Current返回当前集合中的元素,Reset()方法恢复初始化指向的位置,MoveNext()方法返回值true表示迭代器成功前进到集合中的下一个元素,返回值false表示已经位于集合的末尾。能够提供元素遍历的集合对象,在.Net中都实现了IEnumerator接口。

IEnumerable则扮演的就是抽象聚集的角色,只有一个GetEnumerator()方法,如果集合对象需要具备跌代遍历的功能,就必须实现该接口。

1 public interface IEnumerable

3 {
4     IEumerator GetEnumerator();
5 }

Iterator实现要点:

1.迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。

2.迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

3.迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

转载于:https://www.cnblogs.com/1285026182YUAN/p/5163773.html

15. 迭代器模式(Iterator Pattern)相关推荐

  1. 设计模式 - 迭代器模式(iterator pattern) 具体解释

    迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...

  2. 设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern): 属于行为型模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即: 不暴露其内部结构.

  3. 解读设计模式----迭代器模式(Iterator Pattern),谁才是迭代高手

    一.你在开发中使用过迭代吗?      当你在使用JavaScript开发客户端应用的时候使用过for...in吗?  1<script type="text/javascript&q ...

  4. 迭代器模式(Iterator pattern)

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator(); w ...

  5. 33迭代器模式(Iterator Pattern)

    动机(Motivate):     在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种" ...

  6. 听webcast的行为型模式篇-迭代器模式(Iterator Pattern) 记录

    < DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> dotnet或java里 ...

  7. 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern

    1 package com.tn.pattern; 2 3 public class Client { 4 public static void main(String[] args) { 5 Obj ...

  8. c++迭代器模式iterator

    c++迭代器模式iterator 概念 角色和职责 案例 概念 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍 ...

  9. 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

    设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用 ...

  10. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

最新文章

  1. seaborn使用jointplot函数为散点图添加边缘图、添加回归线、为边缘直方图添加密度曲线、自定义边缘直方图的色彩(Change Color of Marginal Histogram Plot
  2. Linux中如何使用mysql和php_hi 感恩节——Linux基础教程之mysql和php
  3. lsof 查看进程打开那些文件 和 查看文件给那个进程使用
  4. redhat 6.4 安装ftp
  5. pyautogui 打包 运行 窗口_试试动态窗口管理器 dwm 吧
  6. poj 1161 最短路构图
  7. PHP+Mysql查询上一篇和下一篇文章实例
  8. C++学习之路 | PTA乙级—— 1033 旧键盘打字 (20 分)(精简)
  9. 诗与远方:无题(五)
  10. php识别中文编码并自动转换为UTF-8
  11. NumPy Cookbook 带注释源码 十一、NumPy 的底牌
  12. Linux学习笔记总结
  13. win7旗舰版系统下载
  14. 从零开始搭建React开发项目之抖音“剪映”——创作课堂(基础入门篇)
  15. java实现极简单的 TXT小说阅读器(第三版)
  16. 解决mingw-w64外网下载太慢问题,离线包安装配置过程讲解
  17. redis集群方式及高可用架构
  18. ITIL变更管理流程的设计
  19. MySQL定时任务,根据时间更新状态
  20. linux计算生日时间,生日计算

热门文章

  1. HDU 1222 Wolf and Rabbit
  2. MANIFEST.MF的用途(转载)
  3. Check the difficulty of problems - poj 2151 (概率+DP)
  4. PhoneGap学习笔记(一) 框架搭建
  5. Information Retrieval --- Outline
  6. 网页类型定义DOCTYPE
  7. 2009年1月5日 洛基网络教室听课笔记
  8. art.dialog重设弹窗大小和刷新位置
  9. java 当前时间格式_JAVA中获取当前系统时间及格式转换
  10. docker 仓库镜像 替换_自己动手创建 Docker 镜像并分享到镜像仓库,容器引擎的用途越来越广泛!...