一,解释:
1,书上的解释:
提供一种方法顺序访问一个集合对象中各个元素,而又不暴露该对象的内部表示
2,自己的理解:
可以按照某种一定的顺序来遍历一个集合
二,用法:
1,涉及到的角色:
迭代器抽象类,聚集抽象类,具体迭代类,具体聚集类
2,什么时候用?
有一个需要遍历的集合
3,如何用?
遍历一个集合对象
4,重点是什么?
定义接口
5,优缺点是什么?
(1)优点:
支持以不同的方式对集合进行遍历
(2)缺点:
添加新的集合类需要添加新的迭代类
6,相关的例子:
一个班级中的报数,要求全部报数,从头开始
三,例子:
1,迭代器抽象类:它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
2,具体的迭代器:它实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,在具体实现时,游标通常是一个表示位置的非负整数。
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];
}
}
3,聚集抽象类:
它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
4,具体聚集类:它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。
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);}
}
}
5,客户端代码:创建一个聚集对象,实例化一个迭代器,,并且开始遍历,
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[0] = "大鸟";
a[1] = "雄安红";
a[2] = "学校";
a[3] = "行李";
a[4] = "老外";
a[5] = "小偷";
Iterator i = new ConcreteIterator(a);
object item = i.First();
while (!i.IsDone ())
{
Console.WriteLine("{0}请买票",i.CurrentItem ());
i.Next();
}
Console.Read ();
}