迭代器模式把对象的职责分离,职责分离可以最大限度减少彼此之间的耦合程度,从而建立一个松耦合的对象。职责分离的要点是对被分离的职责进行封装,并以抽象的方式建立彼此之间的关系。

1、迭代器模式简介

1.1>、定义

  迭代器模式提供一种方法可以顺序访问聚合对象中各个元素,但又不暴露该对象的内部表示。

1.2>、使用频率

  

2、迭代器模式结构

2.1>、结构图

2.2>、参与者

  迭代器模式参与者:

  ◊ Iterator:迭代器定义访问和遍历元素的接口

  ◊ ConcreteIterator

    ° 具体迭代器实现迭代器接口

    ° 对该聚合遍历时跟踪当前位置

  ◊ Aggregate:聚合定义创建Iterator对象的接口

  ◊ ConcreteAggregate:具体聚合,实现相应迭代器的接口,返回具体迭代器的一个适当的实例。

  在迭代器模式中,ConcreteAggregate通过Aggregate定义的接口得到Iterator,并且这是一个ConcreteIterator,该ConcreteIterator具体实现了对ConcreteAggregate的访问与遍历的方法。通过ConcreteIterator可以访问并使用集合中的元素。

3、迭代器模式结构实现

  Iterator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Structural
{
public abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
}

  Aggregate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Structural
{
public abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
}

  ConcreteAggregate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Collections; namespace DesignPatterns.IteratorPattern.Structural
{
public class ConcreteAggregate : Aggregate
{
private ArrayList _items = new ArrayList(); public override 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); }
}
}
}

  ConcreteIterator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Structural
{
public class ConcreteIterator : Iterator
{
private ConcreteAggregate _aggregate;
private int _current = ; public ConcreteIterator(ConcreteAggregate aggregate)
{
this._aggregate = aggregate;
} public override object First()
{
return _aggregate[];
} public override object Next()
{
object ret = null;
if (_current < _aggregate.Count - )
{
ret = _aggregate[++_current];
} return ret;
} public override object CurrentItem()
{
return _aggregate[_current];
} public override bool IsDone()
{
return _current >= _aggregate.Count;
}
}
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.IteratorPattern.Structural; namespace DesignPatterns.IteratorPattern
{
class Program
{
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[] = "Item A";
a[] = "Item B";
a[] = "Item C";
a[] = "Item D"; ConcreteIterator i = new ConcreteIterator(a); Console.WriteLine("Iterating over collection:");
object item = i.First();
while (item != null)
{
Console.WriteLine(item);
item = i.Next();
}
}
}
}

  运行输出:

Iterating over collection:
Item A
Item B
Item C
Item D
请按任意键继续. . .

4、迭代器模式实践应用

  在迭代器模式的设计中,有两种具体的实现方式,分别为外禀迭代器和内禀迭代器。白箱聚集与外禀迭代器:白箱聚集向外界提供访问自己内部元素的接口,从而使得外禀迭代器可以通过聚集提供的方法实现迭代功能。黑箱聚集与内禀迭代器:黑箱聚集不向外界提供遍历自己内部元素的接口,因此聚集的成员只能被聚集内部的方法访问。由于内禀迭代器恰好也是聚集的成员,因此可以访问聚集元素。

4.1、外禀迭代器

  外禀迭代器的迭代过程使用了集合中的元素,通过集合向外界提供了访问自身内部元素的机会。

  Iterator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.ExtrinsicIterator
{
/// <summary>
/// 定义一个迭代器接口
/// </summary>
public interface Iterator
{
/// <summary>
/// 迭代器定位到聚合的第一个元素
/// </summary>
void First(); /// <summary>
/// 遍历下一个
/// </summary>
void Next(); /// <summary>
/// 判断是否完成遍历
/// </summary>
/// <returns></returns>
bool IsDone(); /// <summary>
/// 获得当前遍历的项
/// </summary>
/// <returns></returns>
object CurrentItem();
}
}

  ConcreteIterator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.ExtrinsicIterator
{
/// <summary>
/// 定义具体的迭代器类
/// </summary>
public class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate;
private int index = ;
private int size = ; /// <summary>
/// 根据不同的聚合类进行初始化
/// </summary>
/// <param name="aggregate"></param>
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
size = aggregate.Size();
index = ;
} public void First()
{
index = ;
} public void Next()
{
if (index < size)
{
index++;
}
} /// <summary>
/// 判断是否遍历完毕
/// </summary>
/// <returns></returns>
public bool IsDone()
{
return index >= size;
} /// <summary>
/// 获取当前遍历的元素
/// </summary>
/// <returns></returns>
public object CurrentItem()
{
return aggregate.GetElement(index);
}
}
}

  Aggregate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.ExtrinsicIterator
{
/// <summary>
/// 定义一个抽象的聚合类
/// </summary>
public abstract class Aggregate
{
/// <summary>
/// 只有一个功能,创建迭代器
/// </summary>
/// <returns></returns>
public virtual Iterator CreateIterator()
{
return null;
}
}
}

  ConcreteAggregate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.ExtrinsicIterator
{
/// <summary>
/// 定义一个具体的聚合类
/// </summary>
public class ConcreteAggregate : Aggregate
{
// 存储元素的集合
private object[] objs = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; /// <summary>
/// 获得元素个数
/// </summary>
/// <returns></returns>
public int Size()
{
return objs.Length;
} /// <summary>
/// 获取指定序号的元素
/// </summary>
/// <param name="index">指定的序号</param>
/// <returns></returns>
public object GetElement(int index)
{
if (index < || index > objs.Length)
{
return null;
} return objs[index];
} /// <summary>
/// 创建该聚合类的迭代器
/// </summary>
/// <returns></returns>
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
}
}

  Client.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.ExtrinsicIterator
{
public class Client
{
private Iterator _iterator;
private Aggregate _aggregate = new ConcreteAggregate(); public void Operation()
{
// 获得迭代器
_iterator = _aggregate.CreateIterator(); while (!_iterator.IsDone())
{
Console.WriteLine(_iterator.CurrentItem());
_iterator.Next();
}
} static void Main(string[] args)
{
Client client = new Client();
client.Operation();
}
}
}

  运行输出:

Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
请按任意键继续. . .

4.2、内禀迭代器

  内禀迭代器实现的关键是在集合的内部定义一个私有的具体迭代子类,由它来负责迭代器的所有功能。因为它是集合的私有类,所以它的对象可以遍历集合的内部元素,实现迭代器定义的所有接口,而集合本身并未向外界提供访问自己内部元素的接口。

  Iterator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.IntrinsicIterator
{
/// <summary>
/// 定义一个迭代器接口
/// </summary>
public interface Iterator
{
/// <summary>
/// 迭代器定位到聚合的第一个元素
/// </summary>
void First(); /// <summary>
/// 遍历下一个
/// </summary>
void Next(); /// <summary>
/// 判断是否完成遍历
/// </summary>
/// <returns></returns>
bool IsDone(); /// <summary>
/// 获得当前遍历的项
/// </summary>
/// <returns></returns>
object CurrentItem();
}
}

  Aggregate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.IntrinsicIterator
{
/// <summary>
/// 定义一个抽象的聚合类
/// </summary>
public abstract class Aggregate
{
/// <summary>
/// 只有一个功能,创建迭代器
/// </summary>
/// <returns></returns>
public virtual Iterator CreateIterator()
{
return null;
}
}
}

  ConcreteAggregate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.IntrinsicIterator
{
/// <summary>
/// 定义一个具体的聚合类
/// </summary>
public class ConcreteAggregate : Aggregate
{
// 存储元素的集合
private static object[] objs = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; /// <summary>
/// 定义具体的迭代器类
/// </summary>
private class ConcreteIterator : Iterator
{
private int _index = ; public void First()
{
_index = ;
} public void Next()
{
if (_index < objs.Length)
{
_index++;
}
} public bool IsDone()
{
return _index == objs.Length;
} public object CurrentItem()
{
return objs[_index];
}
} /// <summary>
/// 获得元素个数
/// </summary>
/// <returns></returns>
public int Size()
{
return objs.Length;
} /// <summary>
/// 获取指定序号的元素
/// </summary>
/// <param name="index">指定的序号</param>
/// <returns></returns>
public object GetElement(int index)
{
if (index < || index > objs.Length)
{
return null;
} return objs[index];
} /// <summary>
/// 创建该聚合类的迭代器
/// </summary>
/// <returns></returns>
public override Iterator CreateIterator()
{
return new ConcreteIterator();
}
}
}

  Client.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.IteratorPattern.Practical.IntrinsicIterator
{
public class Client
{
private Iterator _iterator;
private Aggregate _aggregate = new ConcreteAggregate(); public void Operation()
{
// 获得迭代器
_iterator = _aggregate.CreateIterator(); while (!_iterator.IsDone())
{
Console.WriteLine(_iterator.CurrentItem());
_iterator.Next();
}
} static void Main(string[] args)
{
Client client = new Client();
client.Operation();
}
}
}

5、迭代器模式应用分析

  迭代器模式适用情形:

  1>、访问一个具体对象的内容而不暴露它的内部表示;

  2>、支持对聚合对象的多种遍历;

  3>、为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代)。

  迭代器模式特点:

  1>、简化聚集的行为,迭代器具备了遍历的接口,这样聚集的接口就不必具备遍历接口;

  2>、每一个聚集对象都可以有一个或者更多的迭代器对象,每一个迭代器的迭代状态可以彼此独立(外禀迭代器);

  3>、遍历算法被封装到迭代器对象中,迭代算法可以独立于聚集对象变化。Client不必知道聚集对象的类型,通过迭代器可以就读取和遍历聚集对象。这样的好处是聚集本身内部数据发生变化而不影响Client的程序。

C#设计模式系列:迭代器模式(Iterator)的更多相关文章

  1. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  2. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  3. 二十四种设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...

  4. [设计模式] 16 迭代器模式 Iterator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...

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

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

  6. 设计模式 笔记 迭代器模式 Iterator

    //---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型模式 /* 1:意 ...

  7. 行为型设计模式之迭代器模式(Iterator)

    结构 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 适用性 访问一个聚合对象的内容而无需暴露它的内部表示. 支持对聚合对象的多种遍历. 为遍历不同的聚合结构提供一 ...

  8. 设计模式之迭代器模式 Iterator

    代码实现 public interface MyIterator { void first(); //将游标指向第一个元素 void next(); //将游标指向下一个元素 boolean hasN ...

  9. Java 设计模式系列(十五)迭代器模式(Iterator)

    Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...

  10. 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素

    模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...

随机推荐

  1. Codeforces CF#628 Education 8 E. Zbazi in Zeydabad

    E. Zbazi in Zeydabad time limit per test 5 seconds memory limit per test 512 megabytes input standar ...

  2. 一致性hash算法详解

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  3. 2015 ACM/ICPC EC-Final

    A. Boxes and Balls 二分找到最大的不超过$n$的$\frac{x(x+1)}{2}$形式的数即可. #include <bits/stdc++.h> using name ...

  4. Codeforces Round #260 (Div. 2)

    A. Laptops 题目意思: 给定n台电脑,第i台电脑的价格是ai ,质量是bi ,问是否存在一台电脑价格比某台电脑价格底,但质量确比某台电脑的质量高,即是否存在ai < aj 且 bi & ...

  5. 洛谷 P1827 美国血统 American Heritage Label:字符串Water

    题目描述 农夫约翰非常认真地对待他的奶牛们的血统.然而他不是一个真正优秀的记帐员.他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形 ...

  6. 原生js模拟锚点,实现点击后,内容定位到本页的对应位置

    今天在做angularJS项目过程中,遇见了一个需求,在一个页面中有多个表格,每个表格都有对应的分页,点击顶部对应的模块,可以定位到每个表格模块具体的位置. 页面如下所示: 在angular中,为了使 ...

  7. web前端面试题汇总

    1.doctype作用 <!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器用什么文档标准解析这个文档.DOCTYPE不存在 ...

  8. 【转贴】Python处理海量数据的实战研究

    最近看了July的一些关于Java处理海量数据的问题研究,深有感触,链接:http://blog.csdn.net/v_july_v/article/details/6685962 感谢July ^_ ...

  9. sass

    本文来自阮一峰http://www.ruanyifeng.com/blog/2012/06/sass.html 学过CSS的人都知道,它不是一种编程语言. 你可以用它开发网页样式,但是没法用它编程.也 ...

  10. Windows多线程多任务设计初步(转)

    Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...