迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。[GOF 《设计模式》]
在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,
但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。
面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。
Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。
代码1:迭代器
public interface IIterator
{
bool MoveNext();
Object CurrentItem();
void First();
void Next();
}
public class ConcreteIterator : IIterator
{
private ConcreteList list;
private int index;
public ConcreteIterator(ConcreteList list)
{
this.list = list;
index = 0;
}
public bool MoveNext()
{
if (index < list.Length)
return true;
else
return false;
}
public Object CurrentItem()
{
return list.GetElement(index) ;
}
public void First()
{
index = 0;
}
public void Next()
{
if (index < list.Length)
{
index++;
}
}
}
代码2:聚合类
public interface IList
{
IIterator GetIterator();
}
public class ConcreteList : IList
{
int[] list;
public ConcreteList()
{
list = new int[] { 1,2,3,4,5};
}
public IIterator GetIterator()
{
return new ConcreteIterator(this);
}
public int Length
{
get { return list.Length; }
}
public int GetElement(int index)
{
return list[index];
}
}
代码3:客户端代码
class Program
{
static void Main(string[] args)
{
IIterator iterator;
IList list = new ConcreteList();
iterator = list.GetIterator();
while (iterator.MoveNext())
{
int i = (int)iterator.CurrentItem();
Console.WriteLine(i.ToString());
iterator.Next();
}
Console.Read();
}
}
浙公网安备 33010602011771号