设计模式--迭代器模式
概念
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
产品性质开始时会用到。
迭代器为谁服务
迭代器是为容器服务的,什么是容器呢?容器容器,肯定是能够容纳东西的,那么能容纳对象的所有类型都称为容器。而迭代器是遍历元素,元素是哪里的呢?就是容器中的元素。我们举一个例子:有一个售票员,她的工作就是提醒和监督人们买票,有一个问题售票员监督所有人买票吗?不是的,是根据她的工作地点和岗位来看,我们我具体化一个售票员,这个售票员是一个公交车的售票员,那么她所提醒和监督人们买票的容器就是此售票员所在的公交车,例如小红是2路公交车的售票员,那么她的工作就是提醒和监督她所在2路公交车上的乘客来买票,这两2路公交车在这里就是一个容器,再一个问题,小红遍历的是这辆2路公交车,还是在公交上的乘客呢?明显是公交上的乘客,乘客在这里就是元素的角色,也就验证了我们的这句话:迭代器模式就是为了遍历这个容器中的元素而诞生的。
结构图
角色
-
Aggregate
容器角色负责提供创建具体迭代器角色的接口 -
ConcreteAggregate
具体容器实现容器接口定义的方法–创建出容纳迭代器的对象。 -
Iterator
抽象迭代器定义访问和遍历元素的接口。
first()—获得第一个元素
next()—访问下一个元素
isdone()—是否已访问到底部 -
ConcreteIterator
具体的迭代器角色,实现了迭代器接口,完成实际的容器元素的遍历。
迭代器实现
- Aggregate
abstract class Aggregate//聚集抽象类
{
public abstract Iterator CreateIterator();//创建迭代器
}
- Iterator
abstract class Iterator//迭代具体类
{
public abstract object First();//获得第一个元素
public abstract object Next();//访问下一个元素
public abstract bool IsDone();//因为是判断是否到结尾所以用了布尔类型
public abstract object CurrentItem();//当前项
}
- ConcreteIterator
class ConcreteIterator:Iterator
{
private ConcreteAggregate aggregate;//定义了一个具体聚集的对象
private 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
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对象为公交车,也即是聚集对象
a[0] = "1";//表示上车的新乘客
a[1] = "2";
a[2] = "3";
a[3] = "4";
a[4] = "5";
a[5] = "6";
a[6] = "7";
Iterator i = new ConcreteIterator(a);
object item = i.First();
while (!i.IsDone())//从第一个乘客开始轮询
{
Console.WriteLine("{0}请买车票!", i.CurrentItem());//告知乘客买票
i.Next();//下一个乘客
}
Console.Read();
}
例子流程图
我们知道了例子的写法,但是例子到底是怎么运行的呢?实际运行中他们是怎么一起工作的呢?来看一下流程图吧~