Gof定义

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

动机

在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。

迭代器模式结构图:

Aggregate:集合结构接口

Iterator:迭代器接口

Concreteaggregate:集合结构的具体类,继承Aggregate接口

ConcreteIteator:具体的迭代器类

代码实现:

/// <summary>
/// 集合结构接口
/// </summary>
public interface Aggregate
{Iterator CreateIterator();
}
/// <summary>
/// 迭代器接口
/// </summary>
public interface Iterator
{object First();object Next();bool IsDone();object CurrentItem();
}
/// <summary>
/// 集合结构的具体类
/// </summary>
class ConcreteAggregate : Aggregate
{private List<object> items = new List<object>();public Iterator CreateIterator(){return new ConcreteIterator(this);}public int Count{get { return items.Count; }}public object this[int index]{get { return items[index]; }set { items.Insert(index, value); }}
}
/// <summary>
/// 具体的迭代器类
/// </summary>
class ConcreteIterator : Iterator
{private ConcreteAggregate _aggregate;private int _current = 0;public ConcreteIterator(ConcreteAggregate aggregate){this._aggregate = aggregate;}public object First(){return _aggregate[0];}public object Next(){object r = null;_current++;if (_current < _aggregate.Count){r = _aggregate[_current];}return r;}public bool IsDone(){return _current >= _aggregate.Count ? true : false;}public object CurrentItem(){return _aggregate[_current];}
}
/// <summary>
/// 客户端调用
/// </summary>
class Program
{static void Main(string[] args){ConcreteAggregate ca = new ConcreteAggregate();ca[0] = "AspNet3.5 揭秘";ca[0] = "重构:改善既有代码的设计";ca[2] = "设计模式";ca[3] = "人月神话";ca[4] = "代码大全2";Iterator i = new ConcreteIterator(ca);while (!i.IsDone()){Console.WriteLine("要读的书:" + i.CurrentItem());i.Next();}}
}

上面的代码是根据结构图实现的基础代码,在设计的运用中可以使用Net框架给我们提供的相关接口IEnumerable和IEnumerator,这两个接口在Net中的实现代码如下:

public interface IEnumerable
{IEmumerator GetEnumerator();
}
public interface IEmumerator
{Object Current { get; }bool MoveNext();void Reset();
}

在Net中List实现了IEnumerable接口,下面的代码将List作为数据的容器来实现遍历:

class Program
{static void Main(string[] args){List<string> list = new List<string> { "AspNet3.5 揭秘","重构:改善既有代码的设计","设计模式","人月神话","代码大全2"};IEnumerator i = list.GetEnumerator();while (i.MoveNext()){Console.WriteLine("要读的书:" + i.Current);}}
}

上面的代码中试调用List的GetEnumerator方法返回IEmumerator类型的集合,然后取遍历,这样仍然显得比较麻烦,其实在Net中foreach已经实现了这样的功能,代码如下:

class Program
{static void Main(string[] args){List<string> list = new List<string> { "AspNet3.5 揭秘","重构:改善既有代码的设计","设计模式","人月神话","代码大全2"};foreach (string s in list){Console.WriteLine("要读的书:" + s);}}
}

可以看出foreach其实就是实现了下面这段代码

IEnumerator i = list.GetEnumerator();
while (i.MoveNext())
{Console.WriteLine("要读的书:" + i.Current);
}

Iterator模式的几个要点

  • 迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。
    迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
    迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。
作者:oec2003(水杯)
出处:http://oec2003.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/abenmao/archive/2012/05/25/2518030.html

设计模式笔记(18)---迭代器模式(行为型)相关推荐

  1. 18.迭代器模式(行为型)

    迭代器模式(行为型) 原书链接java设计模式(刘伟) 一.相关概念 在软件开发中,我们经常需要使用聚合对象来存储一系列数据.聚合对象拥有两个职责:一是存储数据:二是遍历数据.从依赖性来看,前者是聚合 ...

  2. 设计模式笔记 18. Observer 观察者模式(行为型模式)

    18. Observer 观察者模式                     2008-09-15 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系& ...

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

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

  4. 二、18【设计模式】之迭代器模式

    今天的博客主题 设计模式 --> 设计模式之迭代器模式 命令模式   CP  (Command Pattern) 定义 将一个请求封装成一个对象,使不同的请求把客户端参数化. 命令模式是对命令的 ...

  5. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  6. 《Android源码设计模式》之迭代器模式

    迭代器模式介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor) 模式,是行为型设计模式之一.我们对容器对象的访问必然会涉及遍历算法,如果我没将遍历方法封装到容器中,那么对于容 ...

  7. Java设计模式系列之——迭代器模式

    本篇我们采取倒叙的手法来讲解迭代器模式,先看下面一段我们在平时工作中常见的代码: package com.mazhichu.designpatterns.iterator;import java.ut ...

  8. 设计模式:(迭代器模式)

    1.定义 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为 ...

  9. 设计模式漫谈之迭代器模式

    谈恋爱是两个人的事,结婚是两个家庭的事.最近事也挺多的.我也挺烦的,有时候,我也为自己的将来担忧,我自认为自己的技术过硬,但是千里马只有遇到伯乐才能发挥作用. 技术上让我高兴的事是,有个技术问题终于突 ...

最新文章

  1. 英特尔详解5G将如何助力VR的未来发展
  2. c#_String.Split 方法进阶篇
  3. 科大星云诗社动态20201227
  4. LeetCode 22 括号生成
  5. asp.net Login控件基本属性及事件说明
  6. RobotFramework系列(一):RIDE使用教程
  7. 详述一则DB2 Error Code 1639和SQL State 08001案例诊断和解决方案
  8. 【Elasticsearch】es FST (Finite State Tranduer) 有限状态转换器
  9. 软件设计师备考-软件设计师教程第五版
  10. Stata 中的向量自回归模型(VAR)
  11. vivo Z1的USB调试模式在哪里,打开vivo Z1USB调试模式的经验
  12. 德州大学奥斯汀分校计算机科学排名,德州大学奥斯汀分校专业排名一览及最强专业推荐(QS世界大学排名)...
  13. 密码1-分类,常用类型,密码分析
  14. 游戏本自动掉帧_玩游戏掉帧怎么办?
  15. statsmodels︱python常规统计模型库
  16. android 强制垃圾回收,Android垃圾回收(GC)
  17. radmi4a Android,红米4A(Redmi 4A 全网通)一键ROOT教程,看教程ROOT
  18. 常见Shell编程脚本
  19. C语言设计A与B的区别,C语言辅导 - abc与a=b=c的区别 and something else
  20. LeetCode(Python)—— 将有序数组转换为二叉搜索树(简单)

热门文章

  1. 倦怠和枯燥_启动倦怠
  2. Hadoop集群的基本操作(三:HBase的基本操作)
  3. 利用Nginx实现简易负载均衡
  4. powerdesigner中类图的内部类画法
  5. UI培训分享:如何成为一名优秀的UI设计师
  6. APP不同上线情况对应的测试流程
  7. linux系统中find怎么用,linux系统中‘find’的详细用法
  8. mysql 触发器死循环_请教如何避免该条触发器的死循环
  9. 从HelloWorld看Knative Serving代码实现
  10. 手撸 webpack4.x 配置(一)