天天看点

设计模式(十九)—迭代器模式(行为型)一、简介(Brief Introduction)二、模式分析(Analysis)三、案例分析(Example)四、解决的问题(What To Solve)五、优缺点(Advantage and Disadvantage)六、扩展(Extend)七、联系(Link)八、总结(Summary)

一、简介(Brief Introduction)

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

例子1:电视遥控器的频道遍历

设计模式(十九)—迭代器模式(行为型)一、简介(Brief Introduction)二、模式分析(Analysis)三、案例分析(Example)四、解决的问题(What To Solve)五、优缺点(Advantage and Disadvantage)六、扩展(Extend)七、联系(Link)八、总结(Summary)

二、模式分析(Analysis)

设计模式(十九)—迭代器模式(行为型)一、简介(Brief Introduction)二、模式分析(Analysis)三、案例分析(Example)四、解决的问题(What To Solve)五、优缺点(Advantage and Disadvantage)六、扩展(Extend)七、联系(Link)八、总结(Summary)

Iterator(迭代器):迭代器定义访问和遍历元素的接口

ConcreteIterator(具体迭代器):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置,跟踪聚合中的当前对象,并能够计算出待遍历的后继对象

Aggregate(聚合):聚合定义创建相应迭代器对象的接口

ConcreteAggregate(具体聚合):具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例

三、案例分析(Example)

namespace 迭代器

{

1、客户端

class Program
    {
        static void Main(string[] args)
        {
            ConcrteAggregate a = new ConcrteAggregate();
            a[0] = "大鸟";
            a[1] = "小菜";
            a[2] = "行李";
            a[3] = "老外";
            a[4] = "公交内部员工";
            a[5] = "小偷";

            Iterator i = new ConcreteIterator(a);
            object item = i.First();
            while (!i.IsDone())
            {
                Console.WriteLine("{0} 请买票!", i.CurrentItem());
                i.Next();
            }
            Console.Read();

        }
    }
           

 2、Itrator迭代器抽象类

abstract class Iterator
    {
        public abstract object First();
        public abstract object Next();
        public abstract bool IsDone();
        public abstract object CurrentItem();
    }
           

 3、Aggregate聚集抽象类

abstract class Aggregate
    {
        public abstract Iterator CreateIterator();
    }

    //concreteIterator具体迭代器,继承Iterator
    class ConcreteIterator : Iterator
    {
        private ConcrteAggregate aggregate;   
        private int current = 0;

        public ConcreteIterator(ConcrteAggregate  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 ? true : false;
           
        }

        public override object CurrentItem()
        {
            return aggregate[current];
        }
    }
           

 4、ConcreteAggregate具体聚集类,

class ConcrteAggregate : 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 );}
        }
      
    }
   
}
           

四、解决的问题(What To Solve)

迭代器模式可用来:

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

• 需要为聚合对象提供多种遍历方式。

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

      迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。

      但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我 们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。

五、优缺点(Advantage and Disadvantage)

优点:

1 )它支持以不同的方式遍历一个聚合对象 : 复杂的聚合可用多种方式进行遍历。迭代器模式使得改变遍历算法变得很容易 : 仅需用一个不同的迭代器的实例代替原先的实例即可。你也可以自己定义迭代器的子类以支持新的遍历。

2) 迭代器简化了聚合的接口有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了。这样就简化了聚合的接口。

3) 在同一个聚合上可以有多个遍历每个迭代器保持它自己的遍历状态。因此你可以同时进行多个遍历。

4)在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。

5)封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

缺点

         由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。

六、扩展(Extend)

1)聚合是一个管理和组织数据对象的数据结构。

2)聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。

3)存储数据是聚合对象最基本的职责。

4)将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。

七、联系(Link)

Composite :迭代器常被应用到象复合这样的递归结构上。

FactoryMethod:多态迭代器靠Factory Method来例化适当的迭代器子类。

Memento:常与迭代器模式一起使用。迭代器可使用一个 Memento来捕获一个迭代的状态。迭代器在其内部存储Memento。

八、总结(Summary)

         迭代器结合了封装和多态的面向对象程序设计原理。使用迭代器,你可以对集合中的对象进行操作,而无需专门了解集合如何显现或者集合包含什么(对象的种 类)。迭代器提供了不同固定迭代实现的统一接口,它完全包含了如何操纵特定集合的详细信息,包括显示哪些项(过滤)及其显示顺序(排序)。

继续阅读