什么是迭代器模式?

  迭代器模式(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. ASP.MVC当URL跳转时候参数的安全性

    一个页面跳转到另外一个页面直接将参数写在URL上面并不安全比如 http://XXXXXXXXXXX/meeting/shakeGroup?id=5381&uid=o0En_sj1J0bFgI ...

  2. 在java项目中加入百度富文本编辑器

    富文本编辑器在项目中很常见,他可以将文本,图片等信息存入数据库,在编辑一些图文混排的信息的时候很有用,比如商城项目的商品详情页,包含很多带有样式的文字和图片. 此前一直使用的百度的富文本编辑器uedi ...

  3. Vagrant安装完lnmp后,配置linux和windows共享文件并配置虚拟主机访问项目

    虚拟机目录下的Vagrantfile文件是vagrant的配置文件,如果想把虚拟机当作一台服务器,可以通过ip访问,需要修改配置文件进行配置. (1)第一步:打开虚拟机目录下的Vagrantfile文 ...

  4. OC学习9——反射机制

    1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...

  5. ABP .Net Core 部署到IIS 问题汇总

    在ABP官网创建一个.Net Core项目编译完成 1. 发布网站 2. IIS新建站点 目录指向发布的目录 3.安装WindowsHosting IIS安装服务器上安装DotNetCore.X.X. ...

  6. CET-4- translation1

    questions 2017/10/17 多年来,家长和老手都曾得到过这样一种信息(message):尽量利用任何机会表扬孩子,对他们所干的任何事情都要说好.据说这样做有助于提高孩子的自尊.但是近来许 ...

  7. mysql-5.7.17.msi安装

    mysql-5.7.17.msi安装,跟着截图摩擦,一步一步是爪牙,是魔鬼的步伐 开始: 可以创建其他用户 我自己改了日志名

  8. node.js stream

    stream是一个接口,流是可以从一个读取或写入数据的目标对象 ,Node 中有很多对象实现了这个接口   一.nodejs stream类型 1. Readable - 可读操作. Writable ...

  9. js代码细嚼慢咽

    全局变量的梗 例1: 对于var 的理解:将该变量声明在当前的作用域中,或者说执行上下文中. function add() { result = 3; //result变量即是隐喻全局变量 } add ...

  10. vue.js之过滤器,自定义指令,自定义键盘信息以及监听数据变化

    一.监听数据变化 1.监听数据变化有两种,深度和浅度,形式如下: vm.$watch(name,fnCb); //浅度 vm.$watch(name,fnCb,{deep:true}); //深度监视 ...