C++(設計模式):20---行爲型模式之迭代器模式(Iterator)

行爲型模式概述

  • 行爲模式涉及到算法和對象間職責的分配。行爲模式不僅描述對象或類的模式,還描述它們之間的通信模式。這些模式刻劃了在運行時難以跟蹤的複雜的控制流。它們將你的注意 力從控制流轉移到對象間的聯繫方式上來
  • 行爲類模式使用繼承機制在類間分派行爲。其中包括兩個這樣的模式:
    • 其中TemplateMethod較爲簡單和常用。模板方法是一個算法的抽象定義,它逐步地定義該算法, 每一步調用一個抽象操作或一個原語操作,子類定義抽象操作以具體實現該算法
    • 另一種行爲類模式是Interpreter。它將一個文法表示爲一個類層次,並實現一個解釋器作爲這些類的實例上的一個操作
  • 行爲對象模式使用對象複合而不是繼承。一些行爲對象模式描述了一組對等的對象怎樣 相互協作以完成其中任一個對象都無法單獨完成的任務。這裏一個重要的問題是對等的對象 如何互相瞭解對方。對等對象可以保持顯式的對對方的引用,但那會增加它們的耦合度。在 極端情況下,每一個對象都要了解所有其他的對象。 Mediator在對等對象間引入一個mediator對象以避免這種情況的出現。mediator提供了鬆耦合所需的間接性
  • Chain of Responsibility提供更鬆的耦合。它讓你通過一條候選對象鏈隱式的向一個對 象發送請求。根據運行時刻情況任一候選者都可以響應相應的請求。候選者的數目是任意的, 你可以在運行時刻決定哪些候選者參與到鏈中
  • Observer模式定義並保持對象間的依賴關係。典型的Observer的例子是Smalltalk中的模型/視圖/控制器,其中一旦模型的狀態發生變化,模型的所有視圖都會得到通知
  • 其他的行爲對象模式常將行爲封裝在一個對象中並將請求指派給它:
    • Strategy模式將 算法封裝在對象中,這樣可以方便地指定和改變一個對象所使用的算法
    • Command模式 將請求封裝在對象中,這樣它就可作爲參數來傳遞,也可以被存儲在歷史列表裏,或者以其 他方式使用
    • State模式封裝一個對象的狀態,使得當這個對象的狀態對象變化時,該對象可改變它的行爲
    • Visitor封裝分佈於多個類之間的行爲
    • 而Iterator則抽象了訪問 和遍歷一個集合中的對象的方式
  • 行爲型模式有:

一、意圖

  • 提供一種方法順序訪問一個聚合對象中各個元素 , 而又不需暴露該對象的內部表示。

二、別名

  • 遊標(Cursor)

三、動機

  • 一個聚合對象, 如列表(list), 應該提供一種方法來讓別人可以訪問它的元素,而又不需暴 露它的內部結構. 此外,針對不同的需要,可能要以不同的方式遍歷這個列表。但是即使可以 預見到所需的那些遍歷操作,你可能也不希望列表的接口中充斥着各種不同遍歷的操作。有 時還可能需要在同一個表列上同時進行多個遍歷。
  • 迭代器模式都可幫你解決所有這些問題。這一模式的關鍵思想是將對列表的訪問和遍歷 從列表對象中分離出來並放入一個迭代器(iterator)對象中。迭代器類定義了一個訪問該列 表元素的接口。迭代器對象負責跟蹤當前的元素 ; 即, 它知道哪些元素已經遍歷過了

四、適用性

  • 迭代器模式可用來:
    • 訪問一個聚合對象的內容而無需暴露它的內部表示
    • 支持對聚合對象的多種遍歷
    • 爲遍歷不同的聚合結構提供一個統一的接口 (即,支持多態迭代)

五、結構

六、參與者

  • Iterator(迭代器):迭代器定義訪問和遍歷元素的接口
  • ConcreteIterator(具體迭代器):
    • 具體迭代器實現迭代器接口
    • 對該聚合遍歷時跟蹤當前位置
  • Aggregate(聚合):聚合定義創建相應迭代器對象的接口
  • ConcreteAggregate(具體聚合):具體聚合實現創建相應迭代器的接口,該操作返回ConcreteIterator的一個適當的實例

七、協作

  • ConcreteIterator跟蹤聚合中的當前對象,並能夠計算出待遍歷的後繼對象

八、效果

  • 待續(學習到的時候再回來補)

九、實現

  • 待續(學習到的時候再回來補)

十、代碼示例

  • 待續(學習到的時候再回來補)

十一、相關模式

  • Composite:迭代器常被應用到象複合這樣的遞歸結構上
  • Factory Method:多態迭代器靠Factory Method來例化適當的迭代器子類
  • Memento:常與迭代器模式一起使用。迭代器可使用一個memento來捕獲一個迭代的 狀態。迭代器在其內部存儲memento
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章