什么是迭代器模式?

  迭代器模式(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#学习笔记-迭代器模式的更多相关文章

  1. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  2. 学习笔记——迭代器模式Iterator

    迭代器模式,使用很多,但是很少实现.常用的集合都支持迭代器. 集合中的CreateIterator()可用于创建自己的迭代器,在里面通过调用迭代器的构造函数Iterator(Aggregate)来绑定 ...

  3. Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList

    Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList 一.有如下几个类 1.接口Collection.java 2.接口 ...

  4. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  5. 设计模式学习之迭代器模式(Iterator,行为型模式)(17)

    参考地址:http://www.cnblogs.com/zhili/p/IteratorPattern.html 一.介绍迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作 ...

  6. javascript设计模式学习之七——迭代器模式

    一.迭代器模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,并且不需要暴露该对象的内部表示. 在当前大部分语言中,都已经内置了迭代器模式.迭代器有内部迭代器和外部迭代器之分,一般现有语 ...

  7. 《Head First 设计模式》学习笔记——迭代模式 + 组合模式

    迭代模式设置共生死亡,一般来说.我们只是想实现一个集,我们需要的同时提供这个集合的迭代器,喜欢java中间Collection.List.Set.Map等,这些集合都有自己的迭代器.假如我们要实现一个 ...

  8. 设计模式 笔记 迭代器模式 Iterator

    //---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型模式 /* 1:意 ...

  9. 学习笔记——解释器模式Interpreter

    解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简 ...

随机推荐

  1. Java web轻量级开发面试教程的前言

    本文来是从 java web轻量级开发面试教程从摘录的. 为什么要从诸多的Java书籍里选择这本?为什么在当前网络信息量如此大的情况下还要买这本书,而不是自己通过查阅网络资料学习?我已经会开发Java ...

  2. JavaSe:Comparator

    今天,公司里有一个萌萌的妹子问我java 中的comparator是怎么回事.参数分别是什么,返回值又是什么,为此,我写了一个简单的程序告诉了她: public static void main (S ...

  3. java表单重复提交常用解决办法

    最近在看些基础的东西,顺便做下笔记.相信大家在平时网页使用中,经常会有按钮重复点击,然后点不动刷新,还有当网络延时比较厉害点了没反应在点击的重复提交.为了避免这种情况,总结了一下4点处理方案 表单重复 ...

  4. 理解cocoa和cocoa touch的响应者链

    该文章翻译自:Understanding cocoa and cocoa touch responder chain. 转载注明出处:http://www.cnblogs.com/zhanggui/p ...

  5. 迷宫问题 Maze 4X4 (sloved by backtrack)

    Description 给定一个N*N的迷宫中,(0,0)为起始点,(N-1,N-1)为目的地,求可通往目的地的多个解 思路 这道题其实就是简单的DFS,一路探索到底,没路就回溯到交叉口. #incl ...

  6. iOS支付宝支付相关问题

    支付宝实现以及相关问题:http://www.jianshu.com/p/f81578954974 1.支付宝支付流程 1.用户点击支付2.客户端请求服务器用户支付3.服务器接收请求生成金额订单等要给 ...

  7. scala写算法-用小根堆解决topK

    topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...

  8. Java并发编程之ThreadLocal源码分析

    ## 1 一句话概括ThreadLocal<font face="微软雅黑" size=4>  什么是ThreadLocal?顾名思义:线程本地变量,它为每个使用该对象 ...

  9. bzoj 3718: [PA2014]Parking

    Description 你的老板命令你将停车场里的车移动成他想要的样子. 停车场是一个长条矩形,宽度为w.我们以其左下角顶点为原点,坐标轴平行于矩形的边,建立直角坐标系.停车场很长,我们可以认为它一直 ...

  10. Python学习(一):编写购物车

    1.购物车流程图: 2.代码实现: #!/usr/bin/env python #coding=utf-8 ChoiceOne =''' 1.查看余额 2.购物 3.退出 ''' ChoiceTwo ...