天天看點

設計模式(十九)—疊代器模式(行為型)一、簡介(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)

         疊代器結合了封裝和多态的面向對象程式設計原理。使用疊代器,你可以對集合中的對象進行操作,而無需專門了解集合如何顯現或者集合包含什麼(對象的種 類)。疊代器提供了不同固定疊代實作的統一接口,它完全包含了如何操縱特定集合的詳細資訊,包括顯示哪些項(過濾)及其顯示順序(排序)。

繼續閱讀