我们把对象堆起来放成为一个集合,方法有很多,比如放进数组堆栈列表中。当客户想要遍历这些对象时,你打算让他看到你的实现么?当然不要!一点专业范儿都没了。
所以今天我们谈的就是如何让客户遍历对象而又无法窥视你存储对象的方式——迭代器模式
概述
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
适用情况:当不需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的,或在需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。
结构图
示例:
时间:火烧赤壁之前 地点:来自星星的公司
事件:好多人来参加面试公司今天的招聘。现在要做的就是怎么样让每个人都能得到HR的面试。
我们提供了这样一种方法,
①给等待面试的每一个人编了一个号,并让他们坐在准备室(座位任意)。
②找一个小兵,小兵负责去准备室叫号,并等所有人面试完报告一声。
③HR在考场。
来,上代码!
//面试——迭代器实例 开始了。。。。准备好了不。。。。
class Program
{
//用于定义得到开始对象,得到下一个对象 判断是否到结尾,当前对象等抽象方法,统一接口(迭代器抽象类 )
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
// 抽象的一个小兵(聚集抽象类 )
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
//具体的小兵 工作权利 (具体迭代器)
class 小兵 : Iterator
{
private 准备室 准备室;
private int current = 0;
public 小兵(准备室 准备室)//定义了一个具体聚集对象
{ this.准备室=准备室; }
public override object First()//叫第一个人
{ return 准备室[0];}
public override object Next()//叫下一个人
{
object ret=null;
current++;
if (current<准备室.Count)
{
ret =准备室[current];
}
return ret;
}
public override bool IsDone()//判断当前是否遍历到结尾
{
return current >=准备室 .Count?true:false;
}
public override object CurrentItem()
{
return 准备室[current];
}
}
//具体聚集类 继承Aggregate
class 准备室:Aggregate
{
private IList <object> items=new List<object>();
public override Iterator CreateIterator()
{
return new 小兵(this);
}
public int Count
{
get { return items.Count; }
}
public object this[int index]
{
get { return items[index]; }
set { items.Insert(index,value );}
}
}
//客户端
static void Main(string[] args)
{
准备室 a = new 准备室();
a[0] = "诸葛亮";
a[1] = "孙悟空";
a[2] = "李敏镐";
a[3] = "朱丽叶";
a[4] = "梅超风";
a[5] = "小乔";
Iterator i = new 小兵(a);
object item = i.First();
while (!i.IsDone())
{
Console.WriteLine("{0} 请进考场,祝您好运!", i.CurrentItem());
i.Next();
}
Console.Read();
}
}
}
结果显示
这样做的好处是,HR不用看见准备室的情况,也能遍历每一个应聘者。
而且也不用关心准备室的人的座位顺序。并且,小兵也可以采用多种方式遍历,如从大号到小号或从小号到大号等顺序。
值得一提的是,在现在的高级编程语言如c#Java等,本身已经把这个模式做在语言中了。即foreach in。但是这种模式的思想是需要我们好好领会的。不说了不说了,小兵来叫他们考试了。