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