什么是迭代器模式?

  迭代器模式(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. linux下使用自带mail发送邮件(超简单)

    linux 发邮件最简单的办法 ,也可以使用公司邮箱,需要安装mailx工具,mailx是一个小型的邮件发送程序. 具体步骤如下: 1.安装 [root@001 ~]# yum install mai ...

  2. Liunx的常用命令

    常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir 创建目录 -p 创建目录,若无父目录,则创建p(paren ...

  3. Eclipse 使用小结

    代码智能提示 Java智能提示 Window -> Preferences -> Java -> Editor -> Content Assist -> Auto Act ...

  4. Django的Models(三)

    ORM操作的一些进阶的方法: ################################################################## # PUBLIC METHODS T ...

  5. [转]addEventListener() 方法,事件监听

    转载  白杨-M  http://www.cnblogs.com/baiyangyuanzi/p/6627401.html addEventListener() 方法,事件监听 你可以使用 remov ...

  6. 利用reverse索引优化like语句的方法详解

    在有一些情况下,开发同学经常使用like去实现一些业务需求,当使用like时,我们都知道使用like 前%(like '%111')这种情况是无法使用索引的,那么如何优化此类的SQL呢,下面是一个案例 ...

  7. 什么是JWT(JSON WEB TOKEN)

    转自于:http://www.jianshu.com/p/576dbf44b2ae 什么是JWT Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准( ...

  8. 截屏 iOS

    #pragma mark - 截屏 + (UIImage *_Nonnull)screenShotWithController:(UIViewController *_Nonnull)controll ...

  9. Android活动生命周期

    任务(Task) Android 是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack).在默认情况下,每当我们启动了一个新的活动,它 ...

  10. springboot 入门四-时间类型处理

    springboot 自带了jackson来处理时间,但不支持jdk8 LocalDate.LocalDateTime的转换. 对于Calendar.Date二种日期,转换方式有二种: 一.统一app ...