C#学习笔记-迭代器模式
什么是迭代器模式?
迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
何时使用迭代器模式?
当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,需要考虑使用迭代器模式。
迭代器模式的组成
Iterator():迭代器抽象类,用于定义得到开始对象,对到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口。
ConcreteAggregate():保存聚合对象。
ConcreteIterator():继承于Iterator,实现具体如何对聚合对象的操作。
迭代器模式具体实现
迭代器模式的结构

迭代器模式的实现:
Iterator:
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
ConcreteIterator:
//顺序遍历
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate;
private int current = ;
//将现在的数据组传输进来
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
public override object CurrentItem()
{
return aggregate[current];
} public override object First()
{
return aggregate[];
} public override bool IsDone()
{
return current >= aggregate.Count ? true : false;
} public override object Next()
{
object obj = null;
current++;
if (current < aggregate.Count)
{
obj = aggregate[current];
}
return obj;
}
}
//逆序遍历
class ConcreteIteratorDesc : Iterator
{
private ConcreteAggregate aggregate;
private int current = ;
//传输数据进来
public ConcreteIteratorDesc(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
current = aggregate.Count - ;
}
public override object CurrentItem()
{
return aggregate[current];
} public override object First()
{
return aggregate[aggregate.Count - ];
} public override bool IsDone()
{
return current < ? true:false;
} public override object Next()
{
object obj = null;
current--;
if (current >= )
{
obj = aggregate[current];
}
return obj;
}
}
ConcreteAggregate:
/// <summary>
/// 创建迭代器
/// 在这里看并没有什么具体的用处
/// </summary>
abstract class Aggregate
{
public abstract Iterator CreateIterator();
} /// <summary>
/// 作用是保存数据,保存的数据是一系列数据,所以用数组
/// 然后传输数据给ConcreteIterator
/// </summary>
class ConcreteAggregate : Aggregate
{
//用于存放聚合对象
private IList<object> items = new List<object>();
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
//数组的长度,也就是ConcreteAggregate的属性
public int Count { get { return items.Count; } }
/// ConcreteAggregate现在是数组形式
/// get获取当前的数据
/// set将新来的数据插入到ConcreteAggregate中
public object this[int index]
{
get { return items[index]; }
set { items.Insert(index, value); }
}
}
主函数调用:
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[] = "A";
a[] = "B";
a[] = "C";
a[] = "D";
a[] = "E";
a[] = "F"; Iterator i = new ConcreteIterator(a);
object item = i.First();
while (!i.IsDone())
{
Console.WriteLine("{0} buy ticket,please", i.CurrentItem());
i.Next();
} Iterator id = new ConcreteIteratorDesc(a);
object itemdec = id.First();
while (!id.IsDone())
{
Console.WriteLine("{0} buy ticket,please", id.CurrentItem());
id.Next();
} Console.Read();
}
.NET的迭代器实现
迭代器模式在我们现在的使用中其实没有那么麻烦,因为.NET框架已经准备好了相关的接口,只需要实现就好了。
static void Main(string[] args)
{
IList<string> a = new List<string>(); a.Add("A");
a.Add("B");
a.Add("C");
a.Add("D");
a.Add("E");
a.Add("F"); //看见遍历首先考虑foreach
foreach (string item in a)
{
Console.WriteLine("{0} buy ticket,please", item);
}
//支持在泛型集合上进行简单迭代。
IEnumerator<string> e = a.GetEnumerator();
while (e.MoveNext())
{
Console.WriteLine("{0} buy ticket,please", e.Current);
} Console.Read();
}
补充:IEnumerator

备注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。
C#学习笔记-迭代器模式的更多相关文章
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- 学习笔记——迭代器模式Iterator
迭代器模式,使用很多,但是很少实现.常用的集合都支持迭代器. 集合中的CreateIterator()可用于创建自己的迭代器,在里面通过调用迭代器的构造函数Iterator(Aggregate)来绑定 ...
- Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList
Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList 一.有如下几个类 1.接口Collection.java 2.接口 ...
- Java设计模式学习记录-迭代器模式
前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...
- 设计模式学习之迭代器模式(Iterator,行为型模式)(17)
参考地址:http://www.cnblogs.com/zhili/p/IteratorPattern.html 一.介绍迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作 ...
- javascript设计模式学习之七——迭代器模式
一.迭代器模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,并且不需要暴露该对象的内部表示. 在当前大部分语言中,都已经内置了迭代器模式.迭代器有内部迭代器和外部迭代器之分,一般现有语 ...
- 《Head First 设计模式》学习笔记——迭代模式 + 组合模式
迭代模式设置共生死亡,一般来说.我们只是想实现一个集,我们需要的同时提供这个集合的迭代器,喜欢java中间Collection.List.Set.Map等,这些集合都有自己的迭代器.假如我们要实现一个 ...
- 设计模式 笔记 迭代器模式 Iterator
//---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型模式 /* 1:意 ...
- 学习笔记——解释器模式Interpreter
解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简 ...
随机推荐
- 【SqlServer系列】JSON数据
1 概述 本文将结合MSDN简要概述JSON数据. 2 具体内容 JSON 是一种流行的数据格式,用于在现代 Web 和移动应用程序中交换数据. JSON 还可用于在 Microsoft Az ...
- F01:金融学第一定律:时间的价值
很小的时候,我们就听大人们讲过:时间就是金钱. 长大了,也觉得这句话应该是对的.我们很珍惜时间,但是似乎没有看到金钱的急剧增加啊.总之,这是模糊,体验感又不强的一句话. 既然谈到时间的价值,价值最容易 ...
- tomcat启动失败的一种可能性
今天搭建一个新的项目,采用spring+hibernate框架,项目框架搭建完成以后,启动tomcat,报错,如下图. 第一反应是tomcat的问题,于是clean了tomcat,没用,再把tomca ...
- ssm学习(五)--加入分页插件
之前我们的查询列表是将所有的数据查询出来,并没有做分页,当数据很少的时候,是不需要分页,但是如果数据很多的时候,所有数据显示在一个页面显然是不合适的. 之前用hibernate的时候,可以直接通过查询 ...
- 智能合约语言 Solidity 教程系列6 - 结构体与映射
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...
- 【JS】第一个js示例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Oracle初级——续续篇
逝者如斯夫,不舍昼夜 所有的SQL都经过测试,可粘贴,可复制,有问题请各位大神指出...... --约束 与表一起使用 约束不合理的数据,使其不能进入表中? ','李小龙','一班','该学生成天练武 ...
- caffe CuDNN报错问题解决
解决cudnn问题:Loaded runtime CuDNN library: 5005 (compatibility version 5000) but source was compiled wi ...
- BZOJ 4553 Tjoi2016&Heoi2016 序列
Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最 ...
- NIO中的易筋经
匠心零度 转载请注明原创出处,谢谢! 前言 <易筋经>.天下武功出少林,而易筋经是少林寺的镇寺之宝.学好了易筋经就可以轻易地学好其它武功,只不过很少人学到了它的全部精髓.游坦之只是碰巧学了 ...