學習 GoF 設計模式以解決軟件設計中的問題
“不考慮變化的設計可能會在未來面臨重大的重新設計風險。” :埃里希伽瑪
在面向對象設計中,模式是常見問題的一種典型解決方案。當一個解決方案在各種項目中一次又一次地出現時,最終會有人為其命名并詳細描述它。這就是發現模式的方式。
模式就像預制的藍圖,我們可以對其進行自定義以解決代碼中反復出現的問題。模式不是一段特定的代碼,而是解決特定問題的一般思路或者概念。我們可以遵循模式詳細信息,并實施適合程序的解決方案。
1995 年,Erich Gamma、John Vlissides、Ralph Johnson 和 Richard Helm 出版了《Design Patterns: Elements of Reusable Object-Oriented Software》一書(中文:設計模式:可復用面向對象軟件設計),他們將設計模式應用于編程。由于名字太長,它被稱為GOF書或四人幫的書。
為什么要學習這些設計模式
設計模式是針對常見軟件設計問題的一組久經考驗的解決方案。即使從未遇到過這些問題,學習設計模式仍然很有價值,因為它教會我們如何使用面向對象設計的原則解決各種問題。
通過提供模式術語,設計模式還可以促進團隊成員之間的溝通。
設計模式的分類
設計模式分為三大類:
- 創建模式:提供對象創建機制,增加了現有代碼的靈活性和重用性。
- 結構模式:解釋了如何將對象和類組裝成更大的結構,同時保持結構的靈活性和效率。
- 行為模式:負責對象之間的有效溝通和職責分配。
創建設計模式
創建模式提供了各種對象創建機制,增加了現有代碼的靈活性和重用性。
GoF 設計模式中定義了 5 種創建設計模式:
- 單例:單例是一種創建設計模式,它確保一個類只有一個實例,并為這個實例提供一個全局訪問點。
- 工廠:工廠方法是一種創建型設計模式,它提供了在超類中創建對象的接口,同時允許子類更改創建的對象類型。
- 抽象工廠:抽象工廠是一種創建設計模式,它允許生成相關對象的類,而無需指定它們的具體類。
- 構建器:構建器是一種創建設計模式,可逐步構建復雜的對象。可以使用相同的構造代碼創建對象的不同類型和表示。
- 原型:原型是一種創建設計模式,它允許您復制現有對象,而不會使您的代碼依賴于它們的類。
結構設計模式
結構設計模式解釋了如何將對象和類組裝成更大的結構,同時保持它們的靈活性和效率。
GoF 設計模式中定義了 7 種結構設計模式:
- 適配器:適配器是一種結構設計模式,它允許具有不兼容接口的對象進行通信。
- 復合:復合是一種結構設計模式,它允許您將對象組合成樹結構,然后像處理單個對象一樣使用這些結構。
- 代理: 代理是一種結構設計模式,允許提供占位符或替代另一個對象。使用代理,可以控制對原始對象的訪問,允許在請求被傳遞到原始對象之前或之后執行某些操作。
- 享元:使用享元,可以通過在多個對象之間共享狀態的公共部分而不是將所有數據保留在每個對象中,將更多對象放入 RAM。
- 外觀:外觀是一種設計模式,它為庫、框架或任何其他類集提供簡化的接口。
- 橋接: 允許將一個大類或一組密切相關的類拆分為兩個獨立的層次結構:抽象和實現,以獨立開發。
- 裝飾器:使用裝飾器設計模式,可以通過將新行為放置在包含新行為的特殊包裝對象中來將新行為附加到對象。
行為設計模式
行為模式涉及算法和對象之間的職責分配。
GoF 設計模式中定義了 11 種行為設計模式:
- 模板方法?:模板方法在超類中定義了算法的骨架,允許子類在不修改其結構的情況下覆蓋特定步驟。
- 中介者?:使用中介者,可以減少對象之間的混亂依賴。該模式限制了對象之間的直接通信,并迫使它們僅通過中介進行協作。
- 責任鏈:責任?鏈允許您沿著處理程序鏈傳遞請求。收到請求后,每個處理程序決定是處理請求還是將其傳遞給鏈中的下一個處理程序。
- 觀察者?:觀察者模式允許你定義一種機制來通知多個對象他們正在觀察的對象發生的事件。
- 策略?:使用策略,可以定義一系列算法,將它們放入不同的類,并使它們的對象可互換。
- 命令?:命令是一種行為設計模式,它將請求轉換為包含有關它們的所有信息的獨立對象。通過這種轉換,您可以使用各種請求參數化方法,延遲或排隊請求的執行,并支持可撤消的操作。
- 狀態?:作為一種行為設計模式,狀態允許對象在其內部狀態發生變化時改變其行為。看起來好像對象改變了它的類。
- 訪問者?:使用訪問者模式,您可以將算法與它們操作的對象分開。
- 解釋器?:解釋器是一種行為設計模式
,它定義了一種語言的語法表示,并提供了一個解釋器來處理這種語法。 - 迭代器?:一種稱為迭代器的行為設計模式允許您遍歷集合的元素而不暴露它們的底層表示。
- 備忘錄 : 備忘錄模式允許保存和恢復對象的先前狀態,而無需透露其實現細節。
以上是23種模式的簡介,在接下來一個月的文章中,我們一起來詳細學習這些設計模式。