1、结构图
2、代码
/*************************************************************************
* 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
*
* 适用性:
* 1、访问一个聚合对象的内容而无需暴露它的内部表示。
* 2、支持对聚合对象的多种遍历。
* 3、为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
*
* 协作:ConcreteAggregate跟踪聚合中的当前对象,并能够计算出待遍历的后继对象。
*
* 作者:董怀信
* 日期:2009-06-08
* **********************************************************************/
using System;
using System.Collections.Generic;
namespace DesignPattern.BehavioralPattern
{
/// <summary>
/// 迭代器定义访问和遍历元素的接口。
/// </summary>
/// <typeparam name="T">元素的类型</typeparam>
public interface Iterator<T>
{
void First();
bool Next();
bool IsDone();
T CurrentItem();
}
/// <summary>
/// 聚合定义创建相应迭代器对象的接口。
/// </summary>
/// <typeparam name="T">元素类型</typeparam>
public interface Aggregate<T>
{
Iterator<T> CreateIterator();
}
/// <summary>
/// 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
/// </summary>
/// <typeparam name="T"></typeparam>
public class ConcreteAggregate<T> : Aggregate<T>
{
private List<T> m_itemList;
public ConcreteAggregate(T[] items)
{
m_itemList = new List<T>(items);
}
#region Aggregate<T> Members
public Iterator<T> CreateIterator()
{
return new ConcreteIterator<T>(this);
}
#endregion
/// <summary>
/// 内部类:具体迭代器实现迭代器接口。
/// 对该聚合遍历是跟踪当前位置。
/// </summary>
/// <typeparam name="T"></typeparam>
public class ConcreteIterator<T> : Iterator<T>
{
private ConcreteAggregate<T> m_concreteAggregate;
public ConcreteIterator(ConcreteAggregate<T> aggregate)
{
m_concreteAggregate = aggregate;
}
private int m_index;
#region Iterator<T> Members
public void First()
{
m_index = -1;
}
public bool Next()
{
if (m_index < m_concreteAggregate.m_itemList.Count - 1)
{
m_index++;
return true;
}
return false;
}
public bool IsDone()
{
return m_index == m_concreteAggregate.m_itemList.Count - 1;
}
public T CurrentItem()
{
return m_concreteAggregate.m_itemList[m_index];
}
#endregion
}
}
/// <summary>
/// 客户测试
/// </summary>
public class Client
{
public void Test()
{
string[] items = new string[] { "A", "B", "C", "D" };
Aggregate<string> aggregate = new ConcreteAggregate<string>(items);
Iterator<string> iterator = aggregate.CreateIterator();
Console.WriteLine("Iterator Begin:");
iterator.First();
while (iterator.Next())
{
Console.WriteLine(iterator.CurrentItem());
}
Console.WriteLine("Iterator IsDone:" + iterator.IsDone().ToString());
}
}
}