Java設計模式之GOF23全面講解

一、什麼是設計模式

設計模式(Design pattern) 是解決軟件開發某些特定問題而提出的一些解決方案也可以理解成解決問題的一些思路。通過設計模式可以幫助我們增強代碼的可重用性、可擴充性、 可維護性、靈活性好。我們使用設計模式最終的目的是實現代碼的高內聚和低耦合。

二、設計模式的三大分類及關鍵點

1、創建型模式

對象實例化的模式,創建型模式用於解耦對象的實例化過程。

單例模式:某個類智能有一個實例,提供一個全局的訪問點。工廠模式:一個工廠類根據傳入的參量決定創建出哪一種產品類的實例。抽象工廠模式:創建相關或依賴對象的傢族,而無需明確指定具體類。建造者模式:封裝一個復雜對象的創建過程,並可以按步驟構造。原型模式:通過復制現有的實例來創建新的實例。 2、結構型模式

把類或對象結合在一起形成一個更大的結構。

裝飾器模式:動態的給對象添加新的功能。代理模式:為其它對象提供一個代理以便控制這個對象的訪問。橋接模式:將抽象部分和它的實現部分分離,使它們都可以獨立的變化。適配器模式:將一個類的方法接口轉換成客戶希望的另一個接口。組合模式:將對象組合成樹形結構以表示“部分-整體”的層次結構。外觀模式:對外提供一個統一的方法,來訪問子系統中的一群接口。享元模式:通過共享技術來有效的支持大量細粒度的對象。 3、行為型模式

類和對象如何交互,及劃分責任和算法。

策略模式:定義一系列算法,把他們封裝起來,並且使它們可以相互替換。模板模式:定義一個算法結構,而將一些步驟延遲到子類實現。命令模式:將命令請求封裝為一個對象,使得可以用不同的請求來進行參數化。迭代器模式:一種遍歷訪問聚合對象中各個元素的方法,不暴露該對象的內部結構。觀察者模式:對象間的一對多的依賴關系。仲裁者模式:用一個中介對象來封裝一系列的對象交互。備忘錄模式:在不破壞封裝的前提下,保持對象的內部狀態。解釋器模式:給定一個語言,定義它的文法的一種表示,並定義一個解釋器。狀態模式:允許一個對象在其對象內部狀態改變時改變它的行為。責任鏈模式:將請求的發送者和接收者解耦,使的多個對象都有處理這個請求的機會。訪問者模式:不改變數據結構的前提下,增加作用於一組對象元素的新功能。

三、設計模式的幾種原則

1、單一職責原則

對於一個類,隻有一個引起該類變化的原因;該類的職責是唯一的,且這個職責是唯一引起其他類變化的原因。

2、接口隔離原則

客戶端不應該依賴它不需要的接口,一個類對另一個類的依賴應該建立在最小的接口上。

3、依賴倒轉原則

依賴倒轉原則是程序要依賴於抽象接口,不要依賴於具體實現。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低瞭客戶與實現模塊間的耦合。

4、裡式代換原則

任何基類可以出現的地方,子類一定可以出現。裡氏代換原則是繼承復用的基石,隻有當衍生類可以替換基類,軟件單位的功能不受影響時,基類才能真正的被復用,而衍生類也能夠在基類的基礎上增加新的行為。裡氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化。而基類與子類的繼承關系就是抽象化的具體實現,所以裡氏代換原則是對實現抽象化的具體步驟的規范。

5、開閉原則

(1)對於擴展是開放的(Open for extension)。這意味著模塊的行為是可以擴展的。當應用的需求改變時,我們可以對模塊進行擴展,使其具有滿足那些改變的新行為。也就是說,我們可以改變模塊的功能。

(2)對於修改是關閉的(Closed for modification)。對模塊行為進行擴展時,不必改動模塊的源代碼或者二進制代碼。模塊的二進制可執行版本,無論是可鏈接的庫、DLL或者.EXE文件,都無需改動。

6、迪米特法則

迪米特法則又叫做最少知識原則,就是說一個對象應當對其它對象又盡可能少的瞭解,不和陌生人說話。

7、合成復用原則

合成復用原則要求在軟件復用時,要盡量先使用組合或者聚合等關聯關系來實現,其次才考慮使用繼承關系來實現。如果要使用繼承關系,則必須嚴格遵循裡氏替換原則。合成復用原則同裡氏替換原則相輔相成的,兩者都是開閉原則的具體實現規范。

設計模式七大原則總結(超詳細)

四、設計模式關系

五、設計模式感想

一共有23種設計模式,可以說都是為瞭提高代碼的可讀性、可擴展性、可復用性、類的可替換性、組件化、可移植性等等特性。通過接口、抽象類、繼承、實現、委托、抽象、面向接口編程、多態、重載、重寫等方式使得代碼的這些特性得以彰顯,可以說隻有深刻的理解瞭這些概念背後的哲學思想才能更好的理解設計模式。在設計模式中有很多思想,比如可以使用委托的不要使用繼承、開閉原則,面向擴展開放,面向修改關閉,裡式代換原則,父類一定能被子類代替並使用,反置則不然,面向接口編程,功能層次和實現層次分離(橋接模式)、高內聚低耦合等思想,這些思想都是寶貴的,正是因為這樣的思想的存在才使得代碼的更新換代的時候能夠盡可能少的甚至不用修改之前的代碼,直接加入新的內容。提高軟件的開發周期,便於維護和升級,便於查找和糾錯,易於擴展和使用。

同樣的設計模式主要分為三大類,創建型、行為型、結構型。我們可以簡單的這樣分類,隻不過這樣的分類似乎並不準確,不能一語道出所有的本質,設計模式是相互關聯的,有的設計模式內部其實是使用瞭別的設計模式作為支撐的,但是大體上這樣的一種劃分便於我們去記憶,僅此而已。

六、設計模式回顧

從迭代器開始,我們將類中數據結構的遍歷和類的功能實現分離出來,本質上使用瞭工廠模式;

其次我們學習瞭適配器模式,它將不同的接口進行適配,從而便於版本的兼容性以及其他功能;

然後我們學習瞭模板方法,使用模板面向抽象編程,便於新的子類的實現和管理;

之後學習瞭工廠模式,其實借用瞭模板模式來創建產品,是一種非常重要用處很廣的一種方法;

然後我們學習瞭單例模式,有懶漢式、餓漢式等,生成關於某個類全局唯一的對象,註意多線程的影響;

之後是原型模式,用來復制復雜的對象,使用瞭clone方法,然後是builder模式,用一個新的類對已有的抽象接口進行整合和編程,從而構建出我們想要的東西;

然後是抽象工廠模式,使用瞭工廠模式,組合模式等模式,面向抽象編程,將抽象零件組裝成抽象產品,便於具體工廠的創建,提高瞭代碼的組件化和復用性;

然後是橋接模式,將類的功能層次和實現層次分割開來,便於對應的擴展和使用;

然後是策略模式,可以整體的替換策略,使用也很廣泛;然後是組合模式,保證瞭同根同源,通過委托添加自己構成遞歸,樹形結構,將具有樹形特點的對象組合起來;

然後是裝飾器模式,和組合模式的結構類似,同樣是遞歸結構,從而可以不斷的裝飾,增加新的功能,很好用;

接著是visitor訪問者模式,通過在類外訪問類中的數據結構從而得到想要的結果,便於程序的可擴展性和組件化;

接著是責任鏈模式,推卸責任,根據問題的大小來考慮自己釋放處理,本質是鏈表,便於職責分明;

然後是外觀模式,通過整合各個類之間的調用關系,組建成瞭統一的接口(API),便於外部類的調用;

接著是仲裁者模式,將很多類之間互相關聯的關系交給仲裁者處理,省去瞭各個類之間的嵌套和調動,有利於高內聚和低耦合,思路清晰,便於擴展;

然後是觀察者模式,通過互相委托從而能夠在被觀察的類發生改變的時候得到相應的改變的信息並且處理;

然後是備忘錄模式,通過在某一時刻的狀態保存下來,便於恢復,在遊戲中使用的比較多;

然後是狀態模式,將狀態當做類,從而職責分明,解除瞭很多繁瑣的if和else這些分支邏輯,便於擴展;

然後是享元模式,輕量級對象,通過共用不變對象來實現;

然後是代理模式,懶加載真正的服務器,加快訪問速度,代理是幫助服務器代理的;

然後是命令模式,將命令當做類,通過保存一些列命令,從而能夠隨時執行這些命令,需要清除命令的本質就是一些操作和數據;

最後是解釋器模式,利用編程原理的方法,來更高層次的封裝代碼,將自己開發的java代碼當做編譯系統,從而不用改變java代碼隻修改更高語言層次的代碼就能實現不同的功能。 

到此這篇關於Java設計模式之GOF23全面講解的文章就介紹到這瞭,更多相關Java設計模式講解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: