• 设计模式学习笔记迭代器模式


    概述:                                                                                                      

    迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示。

    实用场合:                                                                                                 

    1.访问一个聚合对象的内容而无需暴露它的内部表示。

    2.支持对聚合对象的多种遍历。

    3.为遍历不同的聚合结构提供一个统一的接口(即,多态迭代)。

    类图:                                                                                                       

    代码结构示例:                                                                                            

    1.迭代器抽象类

        /// <summary>
    /// 迭代器抽象类
    /// 用于定义得到的开始对象,下一个对象,是否到结尾,当前对象方法,统一接口
    /// </summary>
    abstract class Iterator
    {
    public abstract object First();

    public abstract object Next();

    public abstract bool IsDone();

    public abstract object CurrentItem();
    }

    2.实现迭代器类

        class ConcreteIterator:Iterator
    {
    /// <summary>
    /// 定义了一个具体聚集对象
    /// </summary>
    private ConcreteAggregate aggregate;

    private int current = 0;
    /// <summary>
    /// 初始化对象将具体聚集类传入
    /// </summary>
    /// <param name="aggregate"></param>
    public ConcreteIterator(ConcreteAggregate aggregate)
    {
    this.aggregate = aggregate;
    }
    /// <summary>
    /// 第一个对象
    /// </summary>
    /// <returns></returns>
    public override object First()
    {
    return aggregate[0];
    }
    /// <summary>
    /// 得到聚集的下一对象
    /// </summary>
    /// <returns></returns>
    public override object Next()
    {
    object ret = null;
    current
    ++;
    if(current<aggregate.Count)
    {
    ret
    = aggregate[current];
    }
    return ret;
    }
    /// <summary>
    /// 是否到结尾
    /// </summary>
    /// <returns></returns>
    public override bool IsDone()
    {
    return current >= aggregate.Count ? true : false;
    }
    /// <summary>
    /// 返回当前聚集对象
    /// </summary>
    /// <returns></returns>
    public override object CurrentItem()
    {
    return aggregate[current];
    }
    }

    3.聚集抽象类

        /// <summary>
    /// 聚集抽象类
    /// </summary>
    abstract class Aggregate
    {
    /// <summary>
    /// 创建迭代器
    /// </summary>
    /// <returns></returns>
    public abstract Iterator CreateIterator();
    }

    4.聚集实现类

        class ConcreteAggregate:Aggregate
    {
    private IList<object> items = new List<object>();

    public override Iterator CreateIterator()
    {
    return new ConcreteIterator(this);
    }
    /// <summary>
    /// 返回聚集总个数
    /// </summary>
    public int Count
    {
    get { return items.Count; }
    }
    /// <summary>
    /// 声明一个索引器
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    public object this[int index]
    {
    get { return items[index]; }
    set { items.Insert(index, value); }
    }
    }

    5.客户端实现

            /// <summary>
    /// 测试迭代器模式
    /// </summary>
    static void TestIterator()
    {
    //聚集对象
    ConcreteAggregate a = new ConcreteAggregate();

    a[
    0] = "张三";
    a[
    1] = "李四";
    a[
    2] = "叶鹏";
    //声明迭代器对象
    Iterator i = new ConcreteIterator(a);

    object item = i.First();
    while(!i.IsDone())
    {
    Console.WriteLine(
    "{0}回家吃饭",i.CurrentItem());
    i.Next();
    }
    Console.Read();
    }

    小结:                                                                                         

    其实.net框架已经准备好了迭代器接口,只需要实现接口就行了

    IEumerator 支持对非泛型集合的简单迭代

    上面的例子用一个foreach就可以实现了,但是迭代器这种思想如果明白就更好了


  • 相关阅读:
    js获取窗口大小
    ARCGIS接口详细说明
    输入框特效
    GeoServer源码解析和扩展 (二)注册服务
    GeoServer源码解析和扩展 (一)基础篇
    window.open参数大全
    Flex控件
    GeoServer源码解析和扩展 (三)结构篇
    js常用的几个正则表达式
    表单的diabled属性与readonly属性
  • 原文地址:https://www.cnblogs.com/jqbird/p/2160653.html
Copyright © 2020-2023  润新知