為什麼要學習GoF設計模式?
學習 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種模式的簡介,在接下來一個月的文章中,我們一起來詳細學習這些設計模式。
- 天翼雲全場景業務無縫替換至國產原生操作系統CTyunOS!
- 以羊了個羊為例,淺談小程序抓包與響應報文修改
- 這幾種常見的 JVM 調優場景,你知道嗎?
- 如此狂妄,自稱高性能隊列的Disruptor有啥來頭?
- 為什麼要學習GoF設計模式?
- 827. 最大人工島 : 簡單「並查集 枚舉」運用題
- 手把手教你如何使用 Timestream 實現物聯網時序數據存儲和分析
- 850. 矩形面積 II : 掃描線模板題
- Java 併發編程解析 | 基於JDK源碼解析Java領域中的併發鎖,我們可以從中學習到什麼內容?
- 【手把手】光説不練假把式,這篇全鏈路壓測實踐探索
- 大廠鍾愛的全鏈路壓測有什麼意義?四種壓測方案詳細對比分析
- 寫個續集,填坑來了!關於“Thread.sleep(0)這一行‘看似無用’的代碼”裏面留下的坑。
- 857. 僱傭 K 名工人的最低成本 : 枚舉 優先隊列(堆)運用題
- Vue3 實現一個自定義toast(小彈窗)
- 669. 修剪二叉搜索樹 : 常規樹的遍歷與二叉樹性質
- 讀完 RocketMQ 源碼,我學會了如何優雅的創建線程
- 性能調優——小小的log大大的坑
- 1582. 二進制矩陣中的特殊位置 : 簡單模擬題
- elementui源碼學習之仿寫一個el-switch
- 646. 最長數對鏈 : 常規貪心 DP 運用題