zoukankan      html  css  js  c++  java
  • 设计模式17:Iterator 迭代器模式(行为型模式)

    Iterator 迭代器模式(行为型模式)

    动机(Motivation)

    在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透明地访问其包含的元素;同时这种“透明变量”也为“同一种算法在多种集合对象上进行操作”提供了可能。

    使用面向对象技术使这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。

    意图(Intent)
    提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示。——《设计模式》GoF

    结构(Structure)

    示例代码

        abstract class Iterator//抽象迭代器
        {
            public abstract object First();
            public abstract object Next();
            public abstract bool IsDone();
            public abstract object CurrentItem();
        }
    
        abstract class Aggregate//抽象聚集类
        {
            public abstract Iterator CreateIterator();//创建迭代器
        }
    
        class ConcreteAggregate : Aggregate//具体聚集类
        {
            private IList<object> items=new List<object>(); 
            public override Iterator CreateIterator()
            {
                return new ConcreteIterator(this);
            }
    
            public int Count
            {
                get { return items.Count; }
            }
    
            //声明一个索引器
            public object this[int index]
            {
                get { return items[index]; }
                set{items.Insert(index,value);}
            }
        }
    
        class ConcreteIterator : Iterator//具体迭代器
        {
            private ConcreteAggregate aggregate;
            private int current = 0;
    
            public ConcreteIterator(ConcreteAggregate aggregate)//初始化时将具体的聚集对象传入
            {
                this.aggregate = aggregate;
            }
    
            public override object First()
            {
                return aggregate[0];//得到聚集的第一个对象
            }
    
            public override object Next()
            {
                object ret = null;
                current++;
                if (current < aggregate.Count)
                {
                    ret = aggregate[current];
                }
                return ret;
            }
    
            public override bool IsDone()
            {
                return current >= aggregate.Count;
            }
    
            public override object CurrentItem()
            {
                return aggregate[current];
            }
        }

    客户端调用:

            static void Main(string[] args)
            {
                ConcreteAggregate a = new ConcreteAggregate();
                a[0] = "大鸟";
                a[1] = "小菜";
                a[2] = "沙发";
                a[3] = "板凳";
    
                Iterator iterator = new ConcreteIterator(a);
    
                while (!iterator.IsDone())
                {
                    Console.WriteLine(iterator.CurrentItem());
                    iterator.Next();
                }
    
                Console.ReadKey();
            }

    输出:

    大鸟
    小菜
    沙发
    板凳

    Iterator模式的几个要点

    • 迭代抽象:访问一个聚合对象的内部而无需暴露它的内部表示。
    • 迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
    • 迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

    转载请注明出处:

    作者:JesseLZJ
    出处:http://jesselzj.cnblogs.com

  • 相关阅读:
    scala java 混合编译配置
    hadoop自带RPC的使用 代码demo
    《Java多线程设计模式》学习
    b+tree(mongoDB索引,mysql 索引) LSM树(hbase ) Elasticsearch索引
    java jvm虚拟机类加载器
    java jvm虚拟机类加载过程
    凉拌麻辣鸡丝
    C#与C++区别-------转载自博客园-Wei_java
    2019.1.17-我不选ABCD,我选E
    2019.1.1-考研总结and如果二战怎么办
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4773244.html
Copyright © 2011-2022 走看看