故事:
一天,我去北京出游,上了公交车站,人很多很拥挤。
”上车的乘客买票了。”售票员一边在人缝中穿插,一边喊道。
“大爷,您的行李包太大了,需要买两张票。”售票员对一位大爷说。
“行李还需要买票?!它又不是个人。”大爷说,极不情愿地买了两张票。
“还有三位乘客没有买票。”售票员喊道。
“这售票员记性够好的啊,车上有多少人都记得,厉害!”我心想。
此时从人群接连递过来三块钱,票买齐了。售货员一边数着大把的钞票一边做到了自己的位置上。
故事就是这样的,售票员其实在做一件重要的事,就是把车厢里的所有人都遍历了一遍,不放过一个不买票的乘客。这就是一个设计模式的体现——迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
不管你上来的是人还是行李,只要是来乘车的乘客就必须要买票。同理,当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
另外,售票员从车头到车尾来售票,也可以从车尾向车头来售票,也就是说,你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个是谁,是否结束,当前售到哪个人了,这些方法每天他都在做,也就是说,为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
具体代码如下:
Irator 迭代器抽象类
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
Aggregate 聚集抽象类
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
ConcreteIterator具体迭代类,继承Iterator
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate; //定义了一个具体聚集对象
int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate; //初始化时将具体的聚集对象传入
}
public override object First()
{
return aggregate[0]; //得到聚集的第一个对象
}
public override object Next()
{
object ret = null;
current++;
if (current < aggregate.count)
{
ret = aggregate[current];
}
return ret;
}
public override bool IsDone()
{
return current >= aggregate.count ? true : false;
}
public override object CurrentItem()
{
return aggregate[current]; //返回当前的聚集对象
}
}
ConcreteAggregate 具体聚集类 继承Aggregate
class ConcreteAggregate:Aggregate
{
private IList<object> items = new List<object>();
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); } //声明一个索引器
}
}
客户端代码
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[0] = "我";
a[1] = "大爷";
a[2] = "行李";
Iterator i = new ConcreteIterator(a);
object item = i.First();
while (!i.IsDone())
{
Console.WriteLine("{0}请买车票!", i.CurrentItem());
i.Next();
}
Console.Read();
}
}
总结:售票员真是一个迭代高手啊,每次有乘客上车他都数清楚人数,然后再对整车的乘客进行迭代遍历,不放过任何逃票的人。看来任何行业都有技巧和经验,需要多思考、多琢磨,才能做到最好。编程又何尝不是这样,我相信代码没有最好,只有更好,要继续努力!
故事:
一天,我去北京出游,上了公交车站,人很多很拥挤。
”上车的乘客买票了。”售票员一边在人缝中穿插,一边喊道。
“大爷,您的行李包太大了,需要买两张票。”售票员对一位大爷说。
“行李还需要买票?!它又不是个人。”大爷说,极不情愿地买了两张票。
“还有三位乘客没有买票。”售票员喊道。
“这售票员记性够好的啊,车上有多少人都记得,厉害!”我心想。
此时从人群接连递过来三块钱,票买齐了。售货员一边数着大把的钞票一边做到了自己的位置上。
故事就是这样的,售票员其实在做一件重要的事,就是把车厢里的所有人都遍历了一遍,不放过一个不买票的乘客。这就是一个设计模式的体现——迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
不管你上来的是人还是行李,只要是来乘车的乘客就必须要买票。同理,当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
另外,售票员从车头到车尾来售票,也可以从车尾向车头来售票,也就是说,你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个是谁,是否结束,当前售到哪个人了,这些方法每天他都在做,也就是说,为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
具体代码如下:
Irator 迭代器抽象类
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
Aggregate 聚集抽象类
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
ConcreteIterator具体迭代类,继承Iterator
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate; //定义了一个具体聚集对象
int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate; //初始化时将具体的聚集对象传入
}
public override object First()
{
return aggregate[0]; //得到聚集的第一个对象
}
public override object Next()
{
object ret = null;
current++;
if (current < aggregate.count)
{
ret = aggregate[current];
}
return ret;
}
public override bool IsDone()
{
return current >= aggregate.count ? true : false;
}
public override object CurrentItem()
{
return aggregate[current]; //返回当前的聚集对象
}
}
ConcreteAggregate 具体聚集类 继承Aggregate
class ConcreteAggregate:Aggregate
{
private IList<object> items = new List<object>();
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); } //声明一个索引器
}
}
客户端代码
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[0] = "我";
a[1] = "大爷";
a[2] = "行李";
Iterator i = new ConcreteIterator(a);
object item = i.First();
while (!i.IsDone())
{
Console.WriteLine("{0}请买车票!", i.CurrentItem());
i.Next();
}
Console.Read();
}
}
总结:售票员真是一个迭代高手啊,每次有乘客上车他都数清楚人数,然后再对整车的乘客进行迭代遍历,不放过任何逃票的人。看来任何行业都有技巧和经验,需要多思考、多琢磨,才能做到最好。编程又何尝不是这样,我相信代码没有最好,只有更好,要继续努力!