常用設計模式總結


故紙堆里翻出來的收藏博文,稍作整理轉載以作備忘。

--------------------------------------------------------------

常用設計模式總結

據說在歐洲曾經有個男孩自幼酷愛數學,但無奈家貧中學就輟學,但他一直自己學習,后來他感到自己突然發現了一個重大理論,並以這個理論的無比完美而欣喜,直到有一天,一次進城在書店看書的時候,發現原來他發現的理論就是微積分,並且已經存在1百多年了,你可以想象這個男孩當時的心情,最后他自殺了。

隨着經歷的軟件越來越多,發現設計模式越來越重要,特別是當你絞盡腦汁為了解決一個問題構想出一個完美的解決方案之時,你感覺到自己欣喜若狂,甚至開始飄飄然的自我陶醉於自己的聰明才智,但是你突然看到你這種方案原來就是其中的一個前人早已總結好的模式時,你會不會變得非常懊惱呢!反正我是有過這樣的經歷。當然這里的模式沒有微積分的歷史地位和對社會科學的貢獻重要,我們也不可能去模仿那個男孩,但是我們如果主動學習設計模式確實可以少走不少彎路。

下面我就結合自己的學習和應用做一些簡單總結。

一、經典書籍

設計模式的經典書籍,第一本當然就是四人幫的《設計模式》,還有其他人的一些比如《設計模式精解》、《C#設計模式》等。我個人感覺所有設計模式的書籍都很難懂,別想一次看懂,特別是如果你沒有接觸過設計模式,再如果你沒有開發經驗那就更困難了。

二、編碼設計中的幾個原則

1OCP法則:開閉法則(Open-Closed Principle

一個軟件系統應當對擴展開放,對修改關閉

優點:原則的描述就是其優點所在,

1)通過擴展已有軟件系統,可以提供新的行為,以滿足對軟件的新的需求,使變化中的軟件有一定的適應性和靈活性。

2)已有軟件模塊,特別是最重要的抽象層模塊不能再修改,這使變化中的軟件系統有一定的穩定性和延續性

實現原則就是抽象。

2LSP法則:里氏代換原則(Liskov Substitution Principle

把抽象借口和實現分離

這是繼承的特征,子類型(subtype)必須能夠替換它們的基類型。

3DIP法則:依賴倒置原則Dependence Inversion Principle

原則表述:抽象不應當依賴於細節;細節應當依賴於抽象;要針對接口編程,不針對實現編程。具體講就是要依賴於抽象,不要依賴於具體。

實現原則就是,傳遞參數,或者在組合聚合關系中,盡量引用層次高的類。

4ISP原則:接口隔離原則(Interface Segregation Principle

原則:每一個接口應該是一種角色,不多不少,不干不該干的事,該干的事都要干。這類似編碼原則中的最小權限法則。

5CARP法則:合成/聚合復用原則(Composite/Aggregate Reuse Principle

也叫做CRP法則:合成復用原則(CompositeReuse Principle

原則:要盡量使用合成/聚合,盡量不要使用繼承。這就是有一個和是一個的問題。

6、LoD法則:迪米特原則(Law of Demeter

又叫LKP法則:最少知識原則(LeastKnowledge Principle

也就是說,一個對象應當對其它對象有盡可能少的了解。其它表述:這實際上就是設計高內聚低耦合的要求,有人形象地稱謂不要和陌生人講話

三、設計模式的分類

四人幫有兩種分類模式,一是按照目的來分,分為創建型、結構型、行為型,二是按照范圍來分,可分為類模式和對象模式。

創建型模式:與類對象的創建相關。

結構行模式:主要處理類和對象的組合關系。

行為模式:主要為對類或對象如何怎樣交互和如何分配職責進行描述。

類模式:主要處理類和子類之間的關系,這些關系通過繼承建立,是靜態的,在編譯時刻便確定下來了。

對象模式:主要處理對象間的關系,在運行時刻是可變的,更具動態性,大部分的模式都是對象模式。

分類常見下圖


關於工廠模式為類模式、抽象工廠模式為對象模式的分析:

首先這兩個都是創建型模式,創建型類模式和對象模式的主要區別是:類模式使用繼承關系,把對象的創建延遲的子類,對象模式把對象的創建延遲到另一個對象中。

使用工廠模式目的是為了創建對象,但是在創建的這個對象的時候你需要在不同的環境下創建不同的對象,這個不同的環境就有工廠類的子類來決定,因此基類的創建方法為抽象方法,子類類實例化這個方法,這里創建對象的子類對象和基類是繼承關系確定,因此應該為類模式。再來看一下抽象工廠模式的創建過程,首先你要創建的對象可能是隸屬於多個系列,比如可能是不同操作系統的控件、或是不同難度基本的游戲角色等等,這時你所創建的對象所需的工廠就是由抽象工廠的子類實現(這里看和工廠模式沒有區別),但是這個子類根據不同的環境對應不不同的子類對象,是運行時決定的,因此這里應該是對象型創建模式,當然如果這里永遠只產生一個系列的產品,就退化為工廠模式了,也就變成了類模式了,如果在工廠模式中要求新增工廠的子類,並且這些不同的子類創建相同的產品(比如都是按鈕、風格不同)這時工廠模式就上升為抽象工廠模式了,也就變成對象模式了。因此我的理解是區別創建型類模式和對象模式關鍵看創建產品的工廠類對象是不是動態的加以區別即可。  

四、我最常用的設計模式

根據我的經驗我把我經常用到的設計模式在這里做個總結,按照我的經驗,它們的排序如下:1)單件模式、2)抽象工廠模式和工廠模式、3)適配器模式、4)裝飾模式、5)觀察者模式、6)外觀模式其他模式目前還很少用到。

1、單件模式

這是用的最多的模式,每一個正式的軟件都要用它,全局配置、唯一資源、還有一個就是所有的工廠我都設計為單件模式,因此它的使用量大於工廠模式和抽象工廠模式之和。

2、工廠模式和抽象工廠模式

為了在程序代碼中避免出現大量的New,因此我編寫的軟件代碼這兩三年基本都使用了工廠,由於深受受王詠武大俠關於舍熊掌取小魚的影響,因此我較多地選用工廠模式,感覺確實有擴展需要的情況下才使用抽象工廠模式,其實工廠模式就是一個抽象工廠的特例,擴展為抽象工廠也非常容易。

可參考《C++設計模式之一-工廠模式(簡單工廠、工廠和抽象工廠)》。

3、適配器模式

適配器模式有兩種類的適配器和對象適配器,對象適配器更多一些,對象適配器的優點在很多大俠的著作了已經論述n次了,我這里不多啰嗦,我用的較多的原因還有一個,我從C++轉到C#,由於C#不支持多重繼承,我又不比較懶,較少定義interface,因此大多數情況下用C#時也只能使用對象適配器模式了。其實適配器和裝飾模式功能上有很大的相似性,在下面的裝飾模式中加以論述。

4、裝飾模式

也叫油漆工模式,裝飾模式和適配器模式相似都是用來利用現成代碼加以調整來滿足新的需求,其實采用設計模式的目的之一就是復用,這兩個模式正是復用的體現。當你要用這兩種模式的時候都是為你現有軟件新增新的功能,一般情況下,如果你是讓你的軟件新增新的功能操作,你一般要用裝飾模式,你如果要為軟件新增功能支持,你最好選擇適配器模式,你如果想為你的類新增操作你用裝飾模式,你如果要引入其他來源的現成代碼,你用適配器模式。  

5、觀察者模式

這個模式我用的多一個原因就是它可以實現事件功能,當然在C#中可以直接使用事件,但是在C++中卻是用可以用此模式發揮的淋漓盡致了,網上曾經的一個考題(貓大叫一聲,主人醒來,耗子跑開),就是使用這個模式的最好應用。

6、外觀模式

開發就是能復用的地方就復用,這樣才能節省資源,提高效率,外觀模式也是一個提供復用其他現成代碼的解決方案,你需要實現一個功能,可能現成的代碼中就有此功能,但是現成代碼可能遠遠多於你所需要的功能,此時你把這些功能封裝起來,再重新提供一個你所需要的接口,這就是這個模式的精髓所在。

 

參考:

《大話設計模式》

《深入淺出設計模式》

《敏捷軟件開發原則、模式與實踐》

《設計模式--可復用面向對象軟件的基礎》

《設計模式精解-GoF 23種設計模式解析附C++實現源碼》

《面向對象的設計模式(C++ 版)-Tiger Consultation Studio》


易學設計模式分類

C#設計模式迷你速查手冊》 

JAVA與模式》

《Java之美之設計模式23式:1-56-1213-1819-23


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com