/// <summary>
/// 迭代器接口
/// </summary>
public interface ITerator
{
bool MoveNext();
object GetCurrent();
void Next();
void Reset();
}
/// <summary>
/// 数据容器接口
/// </summary>
public interface IDataContainer
{
/// <summary>
/// 获取迭代器
/// </summary>
/// <returns></returns>
ITerator GetIterator();
}
/// <summary>
/// 数据对象
/// </summary>
public class Data : IDataContainer
{
/// <summary>
/// 数据实体
/// </summary>
private int[] _Data;
public Data(int[] data)
{
this._Data = data;
}
/// <summary>
/// 集合长度
/// </summary>
public int Length
{
get { return this._Data.Length; }
}
/// <summary>
/// 根据索引获取值
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public int GetValue(int index)
{
return this._Data[index];
}
/// <summary>
/// 获取迭代器
/// </summary>
/// <returns></returns>
public ITerator GetIterator()
{
return new DataIterator(this);
}
}
/// <summary>
/// 迭代器
/// </summary>
public class DataIterator : ITerator
{
/// <summary>
/// 数据实体
/// </summary>
private Data _Data;
/// <summary>
/// 当前索引值
/// </summary>
private int _Index;
public DataIterator(Data data)
{
this._Data = data;
this._Index = 0;
}
/// <summary>
/// 是否可以继续向下迭代
/// </summary>
/// <returns></returns>
public bool MoveNext()
{
return this._Index < this._Data.Length;
}
/// <summary>
/// 获取当前值
/// </summary>
/// <returns></returns>
public object GetCurrent()
{
return this._Data.GetValue(this._Index);
}
/// <summary>
/// 下一个索引
/// </summary>
public void Next()
{
this._Index++;
}
/// <summary>
/// 重置索引
/// </summary>
public void Reset()
{
this._Index = 0;
}
}
class Program
{
/// <summary>
/// 迭代器模式:
/// 顾名思义,迭代器模式就是可以对一个集合进行迭代循环遍历
/// 所以一个集合可以循环遍历,肯定是有两部分构成:1.集合本身;2.迭代器对象;
///
/// 根据设计模式六大原则的单一职责:
/// 我们应该将集合和迭代器这两部分解耦分离开
/// 所以此时我们需要定义两个接口:1.集合本身;2.迭代器;
/// 然后每个对象都要有具体的实现,这样子就应该有4个对象
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//初始化数据对象
Data data = new Data(new int[] { 1, 9, 6, 2, 8, 33, 44, 66, 88, 65, 2123, 78, 9 });
//获取到数据对象的迭代器
ITerator iterator = data.GetIterator();
//遍历输出数据值
while (iterator.MoveNext())
{
var value = iterator.GetCurrent();
Console.WriteLine(value.ToString());
iterator.Next();
}
Console.WriteLine("End");
Console.ReadKey();
}
}