您的位置:首页 > 其它

18.设计模式_行为模式_迭代器模式_Iterator

2015-12-12 16:44 411 查看

迭代器模式:

迭代器模式:使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历 , 而又不需暴露该对象的内部结构。又叫做游标(Cursor)模式 。

动机

在软件构建过程中,集合对象内部结构常常变化各异。但是对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问器中包含的元素;同时这种“透明遍历”也为“”同一种算法在多种集合对象上进行操作“提供了可能。
使用面向对象技术奖这种遍历机制抽象为”迭代器对象”为"应对变化中的集合对象"提供了一种优雅的方式。

Iterator模式的几个要点

迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。

迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
迭代器的健壮考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

类图



迭代器模式的优缺点:

迭代器模式的优点:简化了遍历,封装性良好 迭代器模式的缺点:遍历时不可以删除或者增加数据对象

与其相关的模式

Composite :迭代器常被应用到象复合这样的递归结构上。
Factory Method:多态迭代器靠Factory Method来例化适当的迭代器子类。
Memento:常与迭代器模式一起使用。迭代器可使用一个 Memento来捕获一个迭代的状态。迭代器在其内部存储Memento。

总结与分析

1)聚合是一个管理和组织数据对象的数据结构。 2)聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。 3)存储数据是聚合对象最基本的职责。 4)将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。

代码

class Program

{

static void Main(string[] args)

{

MyCollection col = new MyCollection();

foreach (int i in col)

{

Console.WriteLine(i.ToString());

}


//完全抽象于(不依赖于)具体集合结构的访问操作

IEnumerator ietor = col.GetEnumerator();

while (ietor.MoveNext())

{

int i = (int)ietor.Current;

Console.WriteLine(i.ToString());

}

}

}

public class MyCollection : IEnumerable

{

int[] items = new int[5] { 11, 22, 33, 44, 55 };

public IEnumerator GetEnumerator()

{

return new MyEnumerator(this);

}


//public IEnumerator GetEnumerator()

//{

//    for (int i = 0; i < items.Length; i++)

//{

//        yield return items[i];

//}

//}

public class MyEnumerator : IEnumerator

{

int nIndex;

MyCollection collection;

public MyEnumerator(MyCollection coll)

{

collection = coll;

nIndex = -1;


}


public object Current

{

get { return collection.items[nIndex]; }

}


public bool MoveNext()

{

nIndex++;

return (nIndex < collection.items.GetLength(0));

}


public void Reset()

{

nIndex = 0;

}

}

}

[/code]

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: