為什麼要學習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 運用題