迭代器模式用于访问一个类,这个类称为聚合类,因为该类中含有很多个对象,迭代器就指定了访问这个类中对象的方法,比如访问第一个数据,访问下一个数据等,代码如下:
1、抽象迭代器类
指定了访问聚合类中对象的方法
interface IIterator
{
void MoveNext();
object GetCurrent();
bool IsFirst();
}
2、具体迭代器类
具体迭代器类除了实现抽象迭代器中的方法以外,还通过构造函数传入了具体聚合类的对象,并通过调用聚合类中的GetList方法来获取具体聚合类中对象的数据集合,并存在一个list的集合中
class ConcreteIterator : IIterator
{
List<object> list = new List<object>();
int index;
public ConcreteIterator(ConcreteProductList concreteProductList)
{
list = concreteProductList.GetList();
index = 0;
}
public void MoveNext()
{
index++;
}
public object GetCurrent()
{
return list[index];
}
public bool IsFirst()
{
return index == 0 ? true : false;
}
}
3、抽象聚合类
定义了一个抽象方法,该方法用于创建迭代器对象,该方法也是一个工厂方法;并且还定义了一个_List的集合对象,用于存储数据;另外还有一个GetList方法,该方法用于将聚合类中存储的数据提供给外部类调用,主要是给具体迭代器类调用
abstract class AbstractProductList
{
List<object> _List = new List<object>();//没有将其申明为Public,放置被任意调用,而是通过GetList方法来获取
public AbstractProductList(List<object> list)
{
this._List = list;
}
/// <summary>
/// 通过该方法返回对象中存储的数据
/// </summary>
/// <returns></returns>
public List<object> GetList()
{
return this._List;
}
public abstract IIterator CreateIterator();//创建迭代器对象
}
4、具体聚合类
重写了抽象聚合类中的创建迭代器的方法,返回了具体迭代器对象;另外调用了基类的构造函数
class ConcreteProductList:AbstractProductList
{
public ConcreteProductList (List <object > list):base (list)
{
}
public override IIterator CreateIterator()
{
return new ConcreteIterator(this);
}
}
调用:
第一步、实例化抽象聚合类同时往聚合类中传入数据;
第二步、用聚合类对象调用具体迭代器
第三步、使用迭代器去访问聚合中的对象
List<object> list = new List<object>() { 1,2,3,4,5};
AbstractProductList abstractProductList = new ConcreteProductList(list);
IIterator iterator = abstractProductList.CreateIterator();
var item = iterator.GetCurrent();
iterator.MoveNext();
var itemNext = iterator.GetCurrent();