zoukankan      html  css  js  c++  java
  • 面向对象编程思想-迭代器模式

    一、引言

    上篇博客中学习了命令模式,是将行为抽象为命令,使得行为请求者和接收者形成低耦合关系。我们知道行为型设计模式关注的是对象职责的分离,今天我们将学习一个新的设计模式,迭代器模式:

    二、迭代器模式

    定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部显示

    下面是迭代器模式结构图:

    下面是代码demo:

        //抽象聚合类
        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); }
            }
        }
        //抽象迭代器类
        abstract class Iterator
        {
            public abstract object First();
            public abstract object Next();
            public abstract bool IsDone();
            public abstract object CurrentItem();
    
        }
         //具体迭代器类
        class ConcreteIterator : Iterator
        {
            private ConcreteAggregate aggregate;
            private int Current = 0;
            public ConcreteIterator(ConcreteAggregate aggregate)
            {
                this.aggregate = aggregate;
            }
    
            public override object CurrentItem()
            {
                return aggregate[Current];
            }
    
            public override object First()
            {
                return aggregate[0];
            }
    
            public override bool IsDone()
            {
                return Current >= aggregate.Count ? true : false;
            }
    
            public override object Next()
            {
                object ret = null;
                Current++;
                if(Current<aggregate.Count)
                {
                    ret = aggregate[Current];
                }
                return ret;
            }
        }
         static void Main(string[] args)
            {
                ConcreteAggregate aggregate = new ConcreteAggregate();
                aggregate[0] = "michael";
                aggregate[1] = "jarle";
                aggregate[2] = "cumming";
                aggregate[3] = "andy";
                ConcreteIterator iterator = new ConcreteIterator(aggregate);
                iterator.First();
                while (!iterator.IsDone())
                {
                    Console.WriteLine($"{iterator.CurrentItem()},请打卡后再下班");
                    iterator.Next();
                }
                Console.Read();
            }
    View Code

    分析:想一下,如果把集合对象和对集合对象的操作放在一起,当我们想换一种方式遍历集合对象中元素时,就需要修改集合对象了,违背“单一职责原则”,而迭代器模式将数据结构和数据结构的算法分离开,两者可独立发展。

    优点:

    1.支持多种遍历方式。比如有序列表,我们根据需要提供正序遍历、倒序遍历两种迭代器。用户只需要得到我们的迭代器,就可以对集合执行遍历操作

    2.简化了聚合类。由于引入了迭代器,原有的集合对象不需要自行遍历集合元素了

    3.增加新的聚合类和迭代器类很方便,两个维度上可各自独立变化

    4.为不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上操作

    缺点:

    1.迭代器模式将存储数据和遍历数据的职责分离增加新的集合对象时需要增加对应的迭代器类,类的个数成对增加,在一定程度上增加系统复杂度

    使用场景:

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

    2.需要为聚合对象提供多种遍历方式

    3.为遍历不同的聚合结构提供一个统一的接口

    关于迭代器模式的学习就到此结束了,希望能够帮到你,若有不足,欢迎斧正,感谢您的阅读。

  • 相关阅读:
    课后总结
    构建之法阅读笔记01
    软件工程周总结02
    开课博客
    二维数组最大子数组和
    大二下周总结四
    大二下周总结三
    定义一个整型数组,返回该数组中子数组和的最大值
    软件工程开课
    定义一个数组返回最大子数组的值(1)
  • 原文地址:https://www.cnblogs.com/jdzhang/p/7390900.html
Copyright © 2011-2022 走看看