設計模式一覽

最近總有想寫點東西的衝動,想來想去,總結下設計模式吧,自己寫一下,不容易忘掉。
1、策略模式
所謂策略模式,是將算法和策略進行分割的一種模式。之所以這樣,其實是基於一種思想,將變化的部分和不變的部分分割開來,如果以後需要修改程序,或者需求變更,只需要修改這部分變化的部分即可,如果有多種算法,相互替換即可。

典型舉例:
我有前n個月份的銷售記錄,希望預測下一個月的銷量。這種預測算法有很多,可能是時間序列算法,可能是線性迴歸,甚至是邏輯迴歸或者是隨機森林(這裏只是舉例子,後面這3種通常來說是離線計算,可能不能用於在線)。而且可以想象,根據預測的情況,算法會隨時進行調整,甚至重構。這時候把算法單獨提取出來,通過一個接口來調用獲取結果。就是很自然的一種設計模式,需要修改時,只需要修改接口的實現即可,增加算法重新增加一種接口的實現即可。

2、單例模式
所謂單例模式,是指一個類只有一種實例。通常該類提供一個靜態方法來獲取該類,另外爲了保證單實例,類的構造函數需要時私有,切調用該構造函數需要加鎖(經典的雙重加鎖)。

典型舉例
比如數據庫的連接池,可以做成一個單例,因爲通常一個數據庫只需要一個連接池即可。

3、工廠模式
所謂工廠模式,定義了一個接口來產生某個對象,但具體實例化哪個對象,則推遲到子類來實現。

經典舉例
比如工廠類來生產槍,這兩個都是接口。而具體的ak47工廠生產ak47,狙擊槍工廠生產狙擊槍。

4、抽象工廠模式
抽象工廠模式,相對工廠模式多了一層封裝,通常是針對一系列對象來的。

經典舉例
抽象工廠類用於武裝士兵,包含槍,子彈,軍服等等等等。其中的每一項都是工廠模式。因而可以理解成抽象工廠模式是工廠模式的一個組合,通常抽象工廠模式會實例化各個factory,由factory決定自己生產的是何種東西,比如是何種槍之類。

5、模板方法模式
模板方法模式,是在一個方法中定義算法的骨架和公共步驟,而將不同的步驟延遲到子類中去實現。這樣的設計可以使子類在不改變算法結構的情況下,重新定義算法中的某些步驟。

經典舉例
泡茶和衝咖啡,公共部分作爲模板方法。

6、觀察者模式
觀察者模式定義了一個對象和依賴者之間的關係,這樣當對象改變狀態時,它的所有的依賴者都會收到通知並執行相應動作。對象叫主題(subject),依賴者叫觀察者(observer)。觀察者模式的好處是主題和觀察者之間的鬆耦合。

經典舉例
下班進門後,小狗/小孩/家人都過來打招呼/拎拖鞋/求抱抱。下班回家這件事就作爲主題,其他作爲各個對象。

7、裝飾模式
裝飾模式,對已有的對象進行裝飾,來擴展其功能。經典的例子比如Java的IO部分,大量使用裝飾模式,將基本的InputStream擴展爲各種讀寫接口。

經典舉例
比如包裝明星,將一個正常人通過嵌套各種光環,或者各種事件,使該人有非常閃光的過去 ,從而有更多的接口,比如演義事業,被狗仔偷拍.etc。

8、命令模式
命令模式,將命令封裝成對象,以便支持不同的請求。可以簡單理解爲遙控器,傳入電視命令對象,執行電視的打開動作,傳入空調命令對象,執行空調的打開動作。命令模式將行爲請求者和行爲實現者進行解耦,而且可以方便的對行爲進行擴展。

經典舉例
比如模擬命令行的實現。

9、適配器模式
適配器模式,將一個類的接口轉換爲期望的另一個接口。

經典舉例
在linux環境中執行windows程序,就需要將大量windows相關接口用適配器轉換爲linux的接口。

10、迭代器模式
提供一種方法順序訪問一個聚合對象中的各個元素,而無需暴露其內部實現。

經典舉例
集合的iterator()

11、組合模式
組合模式,將對象組合以樹狀結構來組織,每個節點可以是葉子節點或一顆子樹,對父節點來說,他們的使用方法保持一致。

經典舉例 文件夾,樹狀結構

12、狀態模式
對象有多種狀態時適用,狀態不同時,相同的動作也會導致不同的結果,這時候適合適用狀態模式。狀態模式的好處在於容易修改和擴展,而用戶不需要對狀態進行感知。

經典舉例
狀態機。

13、代理模式
代理模式,爲一個對象提供一個代理,以控制對該對象的訪問。該模式的有點在於解耦,該對象內部可以很方便的進行修改,而對象的使用者不感知。

經典舉例
防火牆/安全代理

14、建造者模式
建造者模式,將一個複雜的對象通過一步步簡單的建造來構成。這樣一步步的構造相互獨立。好處在於簡單易用,容易構造成複雜的結構。

經典舉例
java的StringBuilder。

15、中介者模式
中介者模式,適用於多種對象間的關聯,該模式將多種對象間的關聯/通信更改爲該對象和中介之間的通信,好處在於將多種對象之間解耦,以方便後續的維護和擴展。

經典舉例
交易系統,各個商戶交易較複雜,可以將所有商品委託給中介,每個人和中介來進行交流。

16、橋接模式
橋接模式,即將抽象和實現相剝離,一般爲了解決多繼承導致的難以維護和擴展,如果一個類需要複雜功能,可以將這些功能按模塊分成多個接口,這些接口相互獨立,即OCP開閉原則。

經典舉例
比如各種顏色,各種形狀的對象,將顏色和形狀作爲接口,可以防止多重繼承。

17、外觀模式
外觀模式,講一個子系統的功能抽象爲一個接口,方便上層進行調用,而不需要了解子系統內部的複雜性。

經典舉例
遙控器,按鍵即可,不需要了解底層實現。

18、責任鏈模式
責任鏈模式,將請求的發送者和接受者解耦,每個接受者不需要知道鏈的結構和其他接受者。

經典舉例
比如Spring的Filter。

19、原型模式
如果創建對象的過程非常昂貴或者複雜,可以不進行創建,而對已有對象進行克隆即可(繼承Cloneable,實現clone方法)。注意淺拷貝和深拷貝。

經典舉例
一個對象需要給多個調用者使用,且多個調用者都可能修改其值時。使用原型模式就很合適,直接克隆出對象即可。

20、備忘錄模式
在不破壞封裝的前提下,捕獲對象內部的狀態,並在對象外部進行保存。以方便對象類進行回退操作。
對象不與備忘錄類進行耦合,而與備忘錄管理類進行耦合。

經典舉例
遊戲回退

21、訪問者模式
將數據結構和數據操作進行分離。優點是容易增加新操作。缺點是破壞了組合類的封裝,而且不方便修改組合結構。

22、解釋器模式
給定一個語言,定義語法表示,解釋器用來定義該句子的文法表示。該模式很少用。

23、享元模式
運用共享來支持細粒度的大量對象,減少內存佔用,提高性能。關鍵點是把共同的部分抽象出來。

經典舉例
JAVA的String

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章