什么是迭代器模式?

  迭代器模式(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 Annotation认知(包括框架图、详细介绍、示例说明)(转)

    本文转自:http://www.cnblogs.com/skywang12345/p/3344137.html 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annota ...

  2. 9.python面向对象编程

    面向对象的几个核心特性如下 Class 类一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法 Object 对象 一 ...

  3. 1. 生成三行文本,过滤文本,cp不覆盖,find查找文件,sed打印行,查看系统信息,磁盘分区

  4. iOS UI特效

    1.iOS特效 a.对应APP中的基本动作分三类: 1.指向性动效(滑动,弹出等) 2.提示性动效(滑动删除,下拉刷新等) 3.空间扩展(翻动,放大等) b.这类动效在设计过程中需要主意几点: 1.系 ...

  5. 转:iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

    本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...

  6. ABP前端使用阿里云angular2 UI框架NG-ZORRO分享

    一.前言 前段时间写博客分享和介绍了阿里云的UI框架NG-ZORRO(博客请查看:http://www.cnblogs.com/donaldtdz/p/7892960.html),结合近段时间对.Ne ...

  7. bzoj 4198: [Noi2015]荷马史诗

    Description 追逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...

  8. bzoj 4817: [Sdoi2017]树点涂色

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  9. vue2.0路由变化1

    路由的步骤 1.定义组件 var Home={ template:'<h3>我是主页</h3>' }; var News={ template:'<h3>我是新闻& ...

  10. 【二十七】php之绘图技术(gd、jpgraph、短信随机验证码)

    1.绘图技术(GD库) 注意:使用该库,php.ini文件中的extension=php_gd2.dll必须是开启状态,不然无法使用 图片格式:目前网站开发常见的图片格式有gif,jpg/jpeg,p ...