作者:手机用户2502901265_642 | 来源:互联网 | 2023-02-13 11:01
迭代器模式:迭代器模式:使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历,而又不需暴露该对象的内部结构。又叫做游标(Cursor)模式。动机在软
迭代器模式:
迭代器模式:使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历 , 而又不需暴露该对象的内部结构。又叫做游标(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
// {
// 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;
}
}
}
来自为知笔记(Wiz)