【設計模式總結篇】

我是太陽啦啦啦發表於2016-03-13

前言:

學習設計模式已經將近一個月了,與大話設計模式之相處日漸之深,此篇部落格是對大話設計模式的一個總結,為自己留下一個學習的腳步!本文從設計模式的三個類別進行總結,對每個設計模式的定義,使用場合,關鍵字幾個方面來介紹。當然,少不了設計模式的原則。

內容:

(一)設計模式之全域性

設計模式按照目的,可分為建立型、行為型、結構型三個類別。

<>建立型模式:

抽象了例項化的過程,它幫助系統獨立於建立、組合和表示它的那些物件。一個類建立型模式使用繼承改變被例項化的類,而一個物件建立型模式將例項化委託給另一個物件。
總結·考慮物件的例項化過程

<>結構型模式

分為類和物件,採用繼承機制來組合介面或實現,這是類建立型模式;通過聚合或依賴一些物件,從而實現新的功能,這是物件建立型模式。
總結·考慮如何組合類和物件以獲得更大的結構

<>行為型模式

行為型模式描述類或物件以及它們之間如何互動及如何分配職責,它 主要涉及通過合理的處理方法,達到使系統升級性和維護性提高的目的。行為類模式使用繼承機制,行為物件模式使用物件複合。
總結·考慮演算法和物件職責的分配















(二)具體

建立型模式:5

*抽象工廠模式:

定義

提供一個建立一系列或相關依賴物件的介面,而無需指定他們具體的類
不直接通過物件的具體實現類,而是通過使用專門的類來負責一組相關聯的物件的建立。

使用場合

1)系統不依賴於產品是如何實現的細節;

2)系統的產品族大於1,而在執行時刻只需要某一種產品族;

3)屬於同一個產品族的產品,必須綁在一起使用;

4)所有的產品族,可以抽取公共介面

總結:建立介面

*建造者模式:

定義

將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示
將一個類的建立過程和他的主體部分分離。
使用場合

在當建立物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時適用的模式。

總結:構建與表示分離。

*工廠方法模式:

定義

一個用於建立物件的藉口,讓子類決定例項化哪一個類,工廠模式使一個類的例項化延遲到子類
Factory Method的主要思想是使一個類的例項化延遲到其子類。

使用場合

1)類不知道它所要建立的物件的類資訊;

2)類希望由它的子類來建立物件

總結:建立物件介面,子類例項化

*原型模式:

定義

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件
克 隆一個已有的類的例項

使用場合:

1)系統不關心物件建立的細節;

2)要例項化的物件的型別是動態載入的;

3)類在執行過程中的狀態是有限的。

總結:拷貝原型建立新物件


*單例模式:

定義

保障一個類只有一個例項,並提供一個訪問它的全域性訪問點
保證一個類只有一個唯一的例項

使用場合

各種“工廠類” 

總結:一類一例項,全域性訪問點        

結構型模式 7

*介面卡

定義

將一個類的介面轉換成客戶希望的另外一個

使用場合

軟體開發後期和維護期:使用一個已經存在的類,但如果它的介面,也就是它的方法和你的要求不相同時
 

總結:轉換介面

*橋接模式   

定義

將抽象部分和它的實現部分分離,使他們都可以獨立變化
將一個類的抽象定義和具體實現解耦。
  使用場合

1)系統需要在元件的抽象化角色與具體化角色之間增加更多的靈活;

2)角色的任何變化都不應該影響客戶端;

3)元件有多個抽象化角色和具體化角色

總結:抽象與實現相分離

*組合模式 

定義

將物件組合成樹形結構以表示部分-整體的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性
   使用場合:

需求中是體現部分和整體層次的結構時,以及你希望使用者忽略組合物件與單個物件的不同,統一地使用這回結構中的所有物件時。
  總結:部分—整體層次結構

*裝飾模式: 

定義

動態的 給一個物件新增一些額外的職責,就增加功能來說,裝飾模式相比生成子類更加靈活
  使用場合

1)需要新增物件職責;

2)這些職責可以動態新增或者取消;

3)新增的職責很多,從而不能用繼承實現。

總結

動態新增職責

*外觀模式 

定義:

為子類系統中 的一組介面提供一個一致的介面外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用
。 

使用場合

三個階段: 

設計初期階段:應該要有意識將兩個不同的層分離,比如經典的三層架構,需要考慮,層與層之間建立外觀,提供介面,降低耦合,
開發階段:子系統因不斷重構演化而變複雜,增加外觀,提供介面,減少依賴
維護階段:當老系統難以維護和擴充套件時,增加外觀,新系統與外觀物件互動,減少麻煩
  總結:為介面提供高層介面

*享元模式  

定義

運用共享技術有效的支援大量細粒度的物件
   使用場合:

如果一個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存可以用相對較少的共享物件取代很多組物件;還有就是物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件
 

總結

共享支援物件

*代理模式 

定義

為其他物件提供一種代理以控制對這個物件的訪問
使用場合

遠端代理
   
虛擬代理
安全代理

智慧代理

總結:

代理訪問物件

行為型模式 11

*模板方法模式 

定義

定義一個操作演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變演算法的結構即可 重定義改演算法的某些特定步驟
  使用場合

使用當不變的和可變的行為在方法的子類實現中混合在一起的時候,不變的行為在子類中重複出現
  總結:

定義演算法骨架,步驟延遲子類

   *命令模式 

定義

將一個請求封裝為一個物件,從而使你可用不同 的請求對客戶進行引數化,可以對請求排隊或記錄日誌,以及支援可撤銷的操作。
  使用場合

1)呼叫者同時和多個執行物件互動;

2)需要控制呼叫本身的生命週期;

3)呼叫可以取消

總結:封裝請求為物件,利用請求引數化

*狀態模式 

定義:

允許一個物件在其內部狀態改變時改變他的行為,讓物件看起來似乎修改了它的類
  使用場合:

當一個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行為時,就可以考慮狀態模式了
  總結:狀態改變,改變行為

*職責鏈模式  

定義

使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係,將這些物件連成一條線,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止 

使用場合

1)輸入物件需要經過一系列處理;

2)這些處理需要在執行時指定;

3)需要向多個操作傳送處理請求;

4)這些處理的順序是可變的

總結:

傳送者和接收者連成一條線,直到處理

*直譯器模式  

定義

給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子
  使用場合:

當有一個語言需要解釋執行,並且可將該語言中的句子表示為一個抽象語法樹時,可使用直譯器模式。
  總結:

定義語言文法,定義直譯器

*中介者模式 

定義

用一箇中介者來封裝一系列物件的互動。中介者使個物件不需要顯示的相互吸引,從而使其耦合鬆散,而且可以獨立 的改變他們之間的互動
  使用場合

中介者模式一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合,以及想要定製一個分佈在多個類中的行為,而又不想生成太多的子類的場合。
  總結

封裝物件互動,解耦和 

*訪問者模式 

定義:

表示作用於某個物件結構中的各個元素的操作,他使你可以在不改變個元素類的前提下定義作用於這些元素的新操作
  使用場合

系統有比較的資料結構,又有易於變化的演算法。
  總結:

定義物件結構新操作

*策略模式  

定義

定義一系列的演算法,把他們一個個封裝起來,並且使他們可相互替換。本模式使得演算法可獨立於使用它的客戶而變化
  使用場合:

1)完成某項業務有多個演算法;

2)演算法可提取公共介面

總結

定義演算法,進行封裝,相互替換

*備忘錄模式 

定義:

在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態
  使用場合

1)物件的屬性比較多,但需要備份恢復的屬性比較少;

2)物件的狀態是支援恢復的

總結

捕獲內部狀態,進行儲存

*迭代器模式  

定義

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

   使用場合

1)訪問一個聚合物件的內容,而不必暴露其內部實現;

2)支援對聚合物件的多種遍歷方式;

3)為遍歷不同的聚合物件提供一致的介面

總結:順序訪問物件元素,不暴露物件內部

(三)六原則

詳細見部落格:設計模式六原則:點選開啟連結


總結:
設計模式的運用,使得程式碼易複用、更靈活讓程式碼更容易被他人理解,保證程式碼的可靠性。設計模式的學習,這是一個階段的學習,以後的學習過程中還會繼續學習,溫故知新,這就是學習。如果有問題的地方,希望與大家交流,提出寶貴意見。

相關文章