閱讀663 返回首頁    go 阿裏雲 go 技術社區[雲棲]


設計模式(Design Patterns)總結歸納

創建型模式

1 AbstractFactory 抽象工廠

關鍵詞:多套方案

意圖提供一個創建多套(每套有相應的一群對象)的方法

適用情況:1、一個係統由多個產品係列中的一個來配置2、強調一係列相關的產品設計。

結構:

 1

這裏麵AbstractFactory是抽象工廠,下麵的兩個是每套方案的工廠,每種工廠有相同的虛函數接口用來創建對象,也可以用於從文件讀入配置來創建,右麵的部分是產品,每個產品派生了在各套方案中不同的實現。

例子:創建不同的界麵方案

Windows* w=new Windows();

Linux* L=new Linux();

void createUI(AF*a,File configure){

AF->……

};//AF是Windows和Linux的基類

當使用時傳入w就是創建Windows的界麵

備注:通常抽象工廠類的實例為單件。

2 builder 生成器

關鍵詞:使用多種不同方案

意圖:為一個應用提供不同的實現方法,通常這個應用者稱為導向器,而不同的實現方法叫做生成器。

結構:

2

Director使用Builder來配置(實現),不同的Builder派生類實現不同的行為

3 Factory Method 工廠方法

關鍵詞:子類產生對象

意圖:定義一個創建對象的接口,讓對不同類型的創建由它的不同子類來實現

結構:

3

例子:例如如果構建一個UI的產生器,可以定義一個基類UICreator,然後子類有buttonCreator、windowCreator等,在虛函數中實現不同的產生。

 

4 Prototype 原型

關鍵詞:通過複製組合已有的對象來產生

意圖:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象

結構:

4

這裏每個原型類都要實現clone()這個虛函數,當需要產生原型的實例時,就調用這個clone()。

這與用直接用new()來產生對象的區別在於原型拷貝可以動態的複製對象的細節,new()隻是創建一個默認參數的實體

5 Singleton 單件

關鍵詞:隻有一個

意圖:程序中隻能有這樣一個實例,並且可以方便的全局的訪問到它

結構:

5

代碼示例:

6

備注:

1、通常如果涉及一個可複用的單件,常把類Sigleton涉及稱模板,然後將你想要做成單件的類繼承自他。

2、可以擴展成隻有限製由N個實例的類。

 

結構型模式

1 Adapter 適配器(Wrapper)

關鍵字:轉換接口以適用

意圖:將一個已存在的接口轉換成用戶所希望的另一個接口

結構:

7

實現:對於類適配器通常共有繼承自target,然後私有繼承Adaptee(私有繼承就是實現Adaptee的所有接口,是指都成為它的私有接口)

         對象適配器通常將Adaptor中添加一個Adaptee成員。

2 Bridge 橋接(handle/body)

關鍵字:抽象與實現分離

意圖:對抽象和實現分離,然後分別擴充(派生)抽象部分與實現部分

結構:

8

3 Composite 組合

關鍵字:組合和單個對象有相同接口,無限組合

意圖:將對象組合成樹形以表示部分-整體層次結構,並且使得用戶對組合對象的使用跟使用單個對象一樣。

結構:

9

4 Decorator 裝飾(Wrapper)

關鍵字:增加附加功能

意圖:動態的給一個對象增添一些附加的功能,而不是使用子類繼承

結構:

10

這裏Decorater必須與它裝飾的對象繼承自一個基類,並有相同的接口,然後他維護一個指向他裝飾的類的一個指針,為它的裝飾的類的操作的前後添加額外的操作。

5 Facade 外觀

關鍵詞:給客戶的一個視圖

意圖:給係統中一組接口提供一個一致的界麵,通常是一個簡單易使用的界麵。是一些客戶不必關心係統中更加複雜的實現細節。

結構:

11

6 Flyweight 享元

關鍵詞:共享,池

意圖:共享大量的細粒度對象

結構:

12

其中Flyweight隻能由它的工廠創建並實例化,客戶取得flyweight隻能去工廠裏尋找。

7 Proxy 代理

關鍵詞:不實際操縱一個類

意圖:為某個對象提供一個代理,讓其他對象通過這個代理進行訪問這個對象。

結構:

13

用途:1、某個對象的操作需要的開銷很大

          2、遠程、保護

          3.靈巧指針。

 

對象行為型模式

1 Chain of Responsibility 職責鏈

關鍵字:層級轉發

意圖:多個對象都有機會處理一個請求,而且通常這些對象之間是有層級關係的,可以將對請求的處理連成一條鏈,是請求沿著鏈傳遞,直到被處理。

結構:

14

既可以讓一個父對象的處理器稱為子對象處理器的後繼,也可以反過來

Qt中的事件在父子對象間的傳遞就是用的這種模式

2 Commond 命令(Action/Transaction)

關鍵字:將請求包裝成對象

意圖:將一個請求的響應封裝在一個對象中,在這個對象中包括所需要的操作

結構:

15

commond中要保存它所執行處理的對象的引用。

用途:1、可以相應一個菜單項的操作,例如Qt中的action類就是個命令類

         2、在commond中可以增加unexcuted和一個鏈表,保存各種狀態,來支持任意次數的後退、前進操作

         3、支持從日誌中恢複

3 Interpreter 解釋器

4 Iterator 迭代器

結構:

16

迭代器已經在標準c++中了,所以c++有介紹它的大篇幅。

5 Mediator 中介

關鍵詞:將聯係變為對象

意圖:用一個中介對象來表示各對象之間的交互,從而避免各對象之間的直接引用。因為通常在打的係統中,類月分散,他們之間的聯係就越多,通常在類中定義與其他類的關係將導致這些類的生存要依賴於其他類,這裏的中介對象封裝他們之間的聯係。

結構:

17

在這裏collegue是這些需要相互交互的類,colleegue要在medistoer中北創建,同時collegue知道meditor的指針,同時concreatemediator也知道concreatecollegue的指針,collegue需要做一個動作的時候,會通知調用mediator,然後mediator調用其他的collegue的行為。

qt的信號與槽的機製應該與該模式有關。

6 Memento 備忘錄

關鍵詞:存儲恢複曆史狀態

意圖:在不破壞封裝性的前提下,存儲一個對象的內部狀態,可以隨時恢複這個對象的曆史狀態

結構:

18 

這裏的caretaker(負責人)可以是一個撤銷恢複係統,隻有originator可以操縱memento,所以memento的成員函數處理析構都為私有,並把originator設為它的友元。

7 Observer 觀察者(Dependencies/Publish—Subscribe)

關鍵詞:相互依賴的對象間保持狀態一致

意圖:當一個對象的狀態發生改變時,所有依賴於它的對象得到通知並被自動更新

結構:

19

這裏observer依賴於subject,subject也可以依賴於observer,首先將observer加入subject的觀察著隊伍中,然後一旦subject的狀態發生改變,他會使用notify來使所有的觀察著update,這個notify也可以由一個觀察著調用,觀察著在update的時候會先檢查一下狀態是否和subject的一致。

使用的例子包括基於同樣的數據(subject)繪製的不同類型的圖標(observer),其中任何一個發生變動,其他的都會隨之而動。

8 State 狀態

關鍵詞:類的狀態決定他的表現行為

意圖:允許一個對象在其狀態發生改變時改變他的行為,例如很多的類有一個決定他性質的狀態,這個狀態完全決定了他的表現,就像tcp的類。

結構:

20

將類的狀態定義成一個類,然後他的表現直接依賴於狀態類的表現。

9 Stratagy 策略

關鍵詞:封裝不同的算法

意圖:定義一個個算法,使得他們可以被封裝起來,方便切換,並且使他們獨立於客戶而存在

結構:

21

實現上就是將這個算法編程一個基類,然後不同的算法為不同的派生類,共同實現一個接口,使用時隻要用不同的派生類實現就是用不同的算法了,這樣可以避免使用switch等語句。

10 Template 模板

關鍵詞:通用算法抽取

意圖:定義一個操作中算法的骨架,而將一些具體特定的實現推遲到子類中。

結構:

22

比如打開文檔這一操作,可以將其定義為一個抽象算法,作為基類,然後不同文件的打開作為派生類,在派生類做不同文件的解析,這樣可以避免使用switch。

11 Visitor 訪問者

關鍵詞:將類的接口拿出來當成服務

意圖:有的時候一些類和其派生類可能要實現大量的接口,而這些接口的存在有可能導致類的龐大和可讀性不好,或是並不是所有的派生類都要有這些接口,但是又有一部分需要這些接口。總之在一切你不想將這些接口實現在這個類中的時候。你可以將這些接口一個個的單獨拿出來形成類,把他們封裝成單獨的針對某個類的服務(這個類為傳入的參數),然後當某個類需要這個接口時,把這個服務給他。

結構:

23

 

將需要的接口封裝成派生於visitor的派生類,然後將接口在這個類中實現。

最後更新:2017-04-02 04:00:25

  上一篇:go i=i++引發的思考
  下一篇:go MVC架構探究及其源碼實現(1)-理論基礎