設計模式之GoF23介紹

深入探討設計模式:構建可維護、可擴展的軟件架構

    • 一、設計模式的背景
      • 1.1 什么是設計模式
      • 1.2 設計模式的歷史
    • 二、設計模式的分類
      • 2.1 創建型模式
      • 2.2 結構型模式
      • 2.3 行為型模式
    • 三、七大設計原則
    • 四、設計模式關系
    • 結論 :rocket: :rocket: :rocket:

在這里插入圖片描述

??在軟件開發領域,設計模式是一種用于解決特定問題的經驗性的、可重用的設計思想。設計模式不僅是面向對象編程(OOP)的基石,更是構建可維護、可擴展軟件架構的重要工具。本文將深入探討設計模式,包括其概念、歷史、分類、七大設計原則以及設計模式關系。

一、設計模式的背景

1.1 什么是設計模式

??設計模式(Design pattern)是對軟件設計中普遍存在的問題的通用解決方案。它們提供了一種在特定上下文中解決問題的方法,是經過驗證的、可復用的設計思想。設計模式不是代碼或庫,而是一種更高層次的抽象,它幫助開發者更好地組織和理解代碼。

??通過設計模式可以幫助我們增強代碼的可重用性、可擴充性、 可維護性、靈活性好。我們使用設計模式最終的目的是實現代碼的高內聚和低耦合。

1.2 設計模式的歷史

??設計模式的概念最早由計算機科學家Christopher Alexander引入,他在建筑領域中提出了“模式語言”的概念。后來,Erich GammaRichard HelmRalph JohnsonJohn Vlissides等四位作者在1994年的著作《設計模式:可復用面向對象軟件的基礎》中將設計模式引入到軟件開發領域。這本書通常被稱為GoFGang of Four,四人組)書籍,成為設計模式領域的經典之作

二、設計模式的分類

在這里插入圖片描述

2.1 創建型模式

??對象實例化的模式,創建型模式用于解耦對象的實例化過程。

  1. 單例模式:某個類智能有一個實例,提供一個全局的訪問點。
  2. 工廠方法模式:一個工廠類根據傳入的參量決定創建出哪一種產品類的實例。
  3. 抽象工廠模式:創建相關或依賴對象的家族,而無需明確指定具體類。
  4. 建造者模式:封裝一個復雜對象的創建過程,并可以按步驟構造。
  5. 原型模式:通過復制現有的實例來創建新的實例。

2.2 結構型模式

??把類或對象結合在一起形成一個更大的結構。

  1. 裝飾器模式:動態的給對象添加新的功能。
  2. 代理模式:為其它對象提供一個代理以便控制這個對象的訪問。
  3. 橋接模式:將抽象部分和它的實現部分分離,使它們都可以獨立的變化。
  4. 適配器模式:將一個類的方法接口轉換成客戶希望的另一個接口。
  5. 組合模式:將對象組合成樹形結構以表示“部分-整體”的層次結構。
  6. 外觀模式:對外提供一個統一的方法,來訪問子系統中的一群接口。
  7. 享元模式:通過共享技術來有效的支持大量細粒度的對象。

2.3 行為型模式

??類和對象如何交互,及劃分責任和算法。

  1. 策略模式:定義一系列算法,把他們封裝起來,并且使它們可以相互替換。
  2. 模板方法模式:定義一個算法結構,而將一些步驟延遲到子類實現。
  3. 命令模式:將命令請求封裝為一個對象,使得可以用不同的請求來進行參數化。
  4. 迭代器模式:一種遍歷訪問聚合對象中各個元素的方法,不暴露該對象的內部結構。
  5. 觀察者模式:對象間的一對多的依賴關系。
  6. 仲裁者模式:用一個中介對象來封裝一系列的對象交互。
  7. 備忘錄模式:在不破壞封裝的前提下,保持對象的內部狀態。
  8. 解釋器模式:給定一個語言,定義它的文法的一種表示,并定義一個解釋器。
  9. 建造者模式:允許一個對象在其對象內部狀態改變時改變它的行為。
  10. 責任鏈模式:將請求的發送者和接收者解耦,使的多個對象都有處理這個請求的機會。
  11. 訪問者模式:不改變數據結構的前提下,增加作用于一組對象元素的新功能。

三、七大設計原則


在這里插入圖片描述

??設計模式的核心是一系列通用的原則,這些原則有助于制定良好的軟件設計方案。以下是七大設計原則:

  1. 單一職責原則 (Single Responsibility Principle, SRP)

    • 一個類應該只有一個引起變化的原因。換句話說,一個類只負責一個功能領域。
  2. 開放/封閉原則 (Open/Closed Principle, OCP)

    • 軟件實體(類、模塊、函數等)應該對擴展開放,對修改關閉。即,我們可以通過添加新的代碼來擴展功能,而不必修改已有的代碼。
  3. 里氏替換原則 (Liskov Substitution Principle, LSP)

    • 子類必須能夠替換其基類而不影響程序的正確性。換句話說,如果一個軟件實體使用了一個基類,那么替換成其子類也不應該導致程序出錯。
  4. 依賴倒置原則 (Dependency Inversion Principle, DIP)

    • 高層模塊不應該依賴于低層模塊,二者都應該依賴于抽象。抽象不應該依賴于細節,細節應該依賴于抽象。
  5. 接口隔離原則 (Interface Segregation Principle, ISP)

    • 不應該強迫一個類實現它不需要的接口。一個類對其他類的依賴應該建立在最小的接口上。
  6. 合成/聚合復用原則 (Composite/Aggregate Reuse Principle, CARP)

    • 首選使用合成/聚合而不是繼承來達到復用的目的。即,通過將現有的類組合在一起創建新的功能,而不是通過繼承。
  7. 迪米特法則 (Law of Demeter, LoD)

    • 一個對象應該對其他對象有最少的了解。一個類不應該直接調用其它對象的內部方法,而應該通過一個中間對象進行調用。

四、設計模式關系


在這里插入圖片描述

結論 🚀 🚀 🚀

??設計模式是軟件開發中的有力工具,通過提供經驗豐富的解決方案,幫助開發者構建可維護、可擴展的軟件系統。然而,應該在實踐中謹慎使用,根據具體情況靈活運用,以避免過度工程和不必要的復雜性。設計模式不僅僅是一種技術,更是一種藝術,需要在實踐中不斷體悟!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213107.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法:爬樓梯(迭代和動態規劃)

迭代 時間復雜度 O(n) 空間復雜度 O(1) /*** param {number} n* return {number}*/ var climbStairs function(n) {let l 0, r 0 , sum 1for(let i1; i<n; i){l rr sumsum l r}return sum }; 動態規劃 時間復雜度 O(n) 空間復雜度 O(n) /*** param {number} n* r…

Memcached學習

一、概念 Memcached是一個開源的&#xff0c;高性能的內存緩存軟件&#xff0c;從名稱上看Mem就是內存&#xff0c;二cache是緩存。作用通過在事先規劃好的內存空間中臨時緩存數據庫中的各類數據&#xff0c;以達到減少業務對數據庫的直接高并發訪問&#xff0c;從而達到提升數…

【密碼學基礎】Diffie-Hellman密鑰交換協議

DH介紹 Diffie-Hellman密鑰協議算法是一種確保共享密鑰安全穿越不安全網絡的方法。 這個機制的巧妙在于需要安全通信的雙方可以用這個方法確定對稱密鑰&#xff0c;然后可以用這個密鑰進行加密和解密。 但是注意&#xff0c;這個密鑰交換協議 只能用于密鑰的交換&#xff0c;而…

Java面試題(每天10題)-------連載(45)

Dubbo篇 1、Dubbo的服務調用流程 2、Dubbo支持那種協議&#xff0c;每種協議的應用場景&#xff0c;優缺點&#xff1f; dubbo&#xff1a; 單一長連接和 NIO 異步通訊&#xff0c;適合大并發小數據量的服務調用&#xff0c;以及消費者遠大于提供者。傳輸協議 TCP&#xff0c;…

Proteus仿真--射擊小游戲仿真設計

本文介紹基于proteus射擊小游戲仿真設計&#xff08;完整仿真源文件及代碼見文末鏈接&#xff09; 仿真圖如下 K1-K4為4個按鍵&#xff0c;用于上移、下移、確認等&#xff0c;模擬單機游戲 仿真運行視頻 Proteus仿真--射擊小游戲仿真設計 附完整Proteus仿真資料代碼資料 …

ArcGIS界面顯示分辨率調整

因為電腦顯示分辨率的問題呢&#xff0c;ArcGIS的界面顯示會字體顯示不合適&#xff0c;出現模糊情況&#xff0c;這時候只需要做個簡單的操作設置一下便可以解決&#xff01; 1、右鍵ArcMap的快捷啟動方式。 2、對應選擇兼容性——>更高DPI設置——>勾選替代DPI縮放行為…

自然場景圖像中的文本檢測綜述

摘 要 本文對自然場景文本檢測問題及其方法的研究進展進行了綜述. 首先, 論述了自然場景文本的特點、自然場景文本檢測技術的研究背景、現狀以及主要技術路線. 其次, 從傳統文本檢測以及深度學習文本檢測的視角出發, 梳理、分析并比較了各類自然場景文本檢測方法的優缺點, 并介…

體系化學習運籌學基礎算法的實踐和總結

文章目錄 引言目標設計目標實踐文章匯總經驗總結一則預告 引言 眨眼間已經12月了&#xff0c;眼看著2023年馬上要過完了。 女朋友最近總說&#xff0c;工作以后感覺時間過的好快。事實上&#xff0c;我也是這么認為的。年紀越大&#xff0c;越會擔心35歲危機的降臨。所以&…

Xubuntu16.04系統中使用EDIMAX EW-7822UAC無線網卡開啟5G自發AP

目錄 1.關于 EDIMAX EW-7822UAC2.驅動安裝3.查看無線網卡信息3.通過create_ap配置5G自發AP 1.關于 EDIMAX EW-7822UAC 官網介紹 https://www.edimax.com/edimax/merchandise/merchandise_detail/data/edimax/global/wireless_adapters_ac1200_dual-band/ew-7822uac/ 詳細參數…

Python開發運維:Python項目發布到K8S集群

目錄 一、實驗 1.Python項目發布到K8S集群 一、實驗 1.Python項目發布到K8S集群 &#xff08;1&#xff09;獲取應用程序代碼 #把hello-python.tar.gz壓縮包上傳到k8s控制節點master1的root下&#xff0c;手動解壓 tar zxvf hello-python.tar.gz &#xff08;2&#xff0…

【Linux】進程周邊001之進程概念

&#x1f440;樊梓慕&#xff1a;個人主頁 &#x1f3a5;個人專欄&#xff1a;《C語言》《數據結構》《藍橋杯試題》《LeetCode刷題筆記》《實訓項目》《C》《Linux》 &#x1f31d;每一個不曾起舞的日子&#xff0c;都是對生命的辜負 目錄 前言 1.基本概念 2.描述進程-PCB…

LeetCode5.最長回文子串

昨天和之前打比賽的隊友聊天&#xff0c;他說他面百度面到這道算法題&#xff0c;然后他用暴力法解的&#xff0c;面試官讓他優化他沒優化出來&#xff0c;這道題我之前沒寫過&#xff0c;我就想看看我能不能用效率高一點的方法把它做出來&#xff0c;我一開始就在想用遞歸或者…

springboot(ssm滁州市特產銷售系統 特產商城系統Java系統

springboot(ssm滁州市特產銷售系統 特產商城系統Java系統 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; …

解決錯誤:sudo debtap -u curl: (22) The requested URL returned error: 404

具體錯誤 $ sudo debtap -u > Synchronizing pkgfile database... :: Updating 2 repos...core is up to dateextra is up to date > Synchronizing debtap database...% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload …

設計CPU功能的數字電路

實驗目的(1)熟悉Multisim 電路仿真軟件的操作界面和功能; (2)掌握邏輯電路綜合設計,并采用仿真軟件進行仿真。 實驗內容1.試設計一個簡易CPU功能的數字電路,實驗至少要求采用4個74HC/HCT194作為4個存儲單元(可以預先對存儲單元存儲數據),74HC283作為計算單元。請實現…

用相似對角矩陣加速矩陣的冪,以斐波那契數列為例

《用相似對角矩陣加速矩陣的冪&#xff0c;以斐波那契數列為例》 在計算機科學和線性代數領域&#xff0c;矩陣的冪是一個常見而重要的問題。特別是對于大型矩陣&#xff0c;直接計算冪可能會變得十分耗時。然而&#xff0c;通過相似對角矩陣的方法&#xff0c;我們能夠以更為…

多維時序 | MATLAB實現RIME-CNN-LSTM-Multihead-Attention多頭注意力機制多變量時間序列預測

多維時序 | MATLAB實現RIME-CNN-LSTM-Multihead-Attention多頭注意力機制多變量時間序列預測 目錄 多維時序 | MATLAB實現RIME-CNN-LSTM-Multihead-Attention多頭注意力機制多變量時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 MATLAB實現RIME-CNN-…

python字符串格式化--數字精度控制和快速寫法與表達式格式化

數字精度控制 我們可以使用m.n來控制數字的寬度和精度&#xff1a; m是寬度&#xff0c;設置必須為數字&#xff0c;且如果設置的數字小于本身&#xff0c;則不生效n控制小數點精度&#xff0c;必須為數字&#xff0c;會進行四舍五入 示例&#xff1a; 5d&#xff1a;是將寬…

idea本地調試hadoop 遇到的幾個問題

1.DEA對MapReduce的toString調用報錯&#xff1a;Method threw ‘java.lang.IllegalStateException‘ exception. Cannot evaluate org.apache.hadoop.mapreduc 解決方法&#xff1a;關閉 IDEA 中的啟用“ tostring() ”對象視圖 2.代碼和hdfs路徑都對的情況下&#xff0c;程序…

架構設計系列之基礎:初探軟件架構設計

11 月開始突發奇想&#xff0c;想把自己在公司內部做的技術培訓、平時的技術總結等等的內容分享出來&#xff0c;于是就開通了一個 Wechat 訂閱號&#xff08;灸哥漫談&#xff09;&#xff0c;開始同步發送內容。 今天&#xff08;12 月 10 日&#xff09;也同步在 CSDN 上開通…