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)
相关文章推荐
- ViewDragHelper分析
- js如何创建类(封装)
- c语言直接读写ini配置文件
- android camera小结
- Storyboard合并文件版本冲突
- iOS开发之MOVE设计模式
- Node js 探讨之 初识node
- 南燕新闻自动生成软件——opensns使用
- Deep Learning Yoshua Bengio
- 点击tomcat的startup .bat文件一闪而过
- jmeter初接触-java请求&参数设置
- Sqlhelper.cs--数据库操作类
- UVa 103 - Stacking Boxes(dp求解)
- linux vim编辑器
- XML解析
- Storyboard代码跳转的几种方法
- IT服务管理国际标准体系学习笔记-1
- 庖丁解牛分词器---源码下载---错误问题解决
- HTML5规范的本地存储
- Screen tearing