設計模式之七大原則

👑單一職責原則

????????單一職責原則告訴我們一個類應該只有一個責任或者只負責一件事情。

????????想象一下,如果一個類承擔了太多的責任,就像一個人同時負責做飯、洗衣服和打掃衛生一樣,那么這個類會變得非常復雜,難以理解和維護。而且,當需要修改其中一個功能時,可能會影響到其他功能,導致意想不到的問題。

????????通過遵循單一職責原則,我們可以將一個復雜的類拆分成多個小的、具有獨立職責的類。每個類只關注自己的職責,這樣代碼會更加清晰、易于理解和修改。

????????舉個例子,假設我們有一個User類,它既負責用戶的登錄驗證,又負責用戶信息的管理。按照單一職責原則,我們可以將這個類拆分成兩個類:一個負責用戶的登錄驗證,另一個負責用戶信息的管理。這樣,當我們需要修改登錄驗證邏輯時,就不會影響到用戶信息的管理部分。

????????總結起來,單一職責原則的核心思想是:一個類應該只有一個責任,這樣可以提高代碼的可讀性、可維護性和可擴展性。

👑里氏替換原則

????????里氏替換原則指導我們如何設計和使用繼承關系。簡單來說,里氏替換原則告訴我們,子類對象可以替換父類對象出現在任何能使用父類對象的地方,而不會產生錯誤或者破壞程序的正確性

????????舉個例子,假設有一個動物類Animal,其中有一個方法叫做makeSound(),用于發出動物的聲音。然后我們派生出了兩個子類Cat和Dog,它們都繼承自Animal類。按照里氏替換原則,我們可以在任何需要Animal對象的地方使用Cat或Dog對象,比如調用makeSound()方法。

????????具體到代碼實現上,如果Cat和Dog類分別實現了自己的makeSound()方法,那么無論是Animal類型的變量還是Cat、Dog類型的變量,都可以調用makeSound()方法,而且得到的結果應該符合預期。

????????總結起來,里氏替換原則的核心思想是:子類對象應該能夠替換父類對象,而不會引起任何錯誤或異常。這樣設計出來的代碼更加靈活、可擴展,并且易于維護。

👑開閉原則

????????開閉原則告訴我們軟件實體(類、模塊、函數等)應該對擴展開放,對修改關閉

????????開閉原則的核心思想是:當需要改變一個系統的行為時,我們應該盡量通過添加新的代碼來實現,而不是修改已有的代碼。這樣做的好處是,我們可以保持已有的代碼穩定性,減少引入新錯誤的風險。

????????舉個例子,假設我們有一個電商網站,其中有一個購物車類Cart,用于管理用戶的購物車信息。現在,我們需要添加一個新的功能,比如優惠券折扣。按照開閉原則,我們應該創建一個新的類DiscountCoupon,并且讓它負責計算折扣金額。然后,在Cart類中,我們可以通過調用DiscountCoupon類的方法來獲取折扣金額,而不是直接修改Cart類的代碼。

????????這樣做的好處是,如果以后我們需要添加其他類型的折扣,比如滿減或者贈品,我們只需要創建相應的類,并且確保它們都符合同一個抽象接口。這樣,我們可以輕松地擴展系統的功能,而不需要修改已有的代碼。

????????總結起來,開閉原則的目標是讓我們能夠通過擴展來改變一個系統的行為,而不需要修改已有的代碼。這樣可以提高代碼的穩定性、可維護性和可擴展性。

👑依賴倒轉原則

????????依賴倒轉原則告訴我們高層模塊不應該依賴于低層模塊,而是應該依賴于抽象。

????????通俗地說,依賴倒轉原則就是要求我們在設計代碼時,盡量使用抽象類或者接口來進行編程,而不是直接依賴具體的實現類。這樣做的好處是,可以降低模塊之間的耦合度,提高代碼的靈活性和可維護性。

????????舉個例子,假設我們有一個電商網站,其中有一個Order類用于處理訂單相關的邏輯。按照依賴倒轉原則,我們應該定義一個抽象的Payment接口,然后讓Order類依賴于這個接口。具體的支付方式,比如支付寶、微信支付等,都應該實現這個接口,并且提供自己的具體實現。

????????這樣做的好處是,當我們需要更換支付方式時,比如從支付寶切換到微信支付,我們只需要創建一個新的實現類,并且修改配置文件或者注入相應的實例即可,而不需要修改Order類的代碼。這樣,我們可以輕松地擴展和變更系統的功能,而不會對其他模塊產生影響。

????????總結起來,依賴倒轉原則的核心思想是:高層模塊不應該依賴于低層模塊,而是應該依賴于抽象。通過使用抽象類或者接口來編程,可以降低模塊之間的耦合度,提高代碼的靈活性和可維護性。

👑接口隔離原則

????????接口隔離原則告訴我們客戶端不應該依賴于它不需要的接口

????????通俗地說,接口隔離原則就是要求我們將龐大而臃腫的接口拆分成更小、更具體的接口,以滿足客戶端的精確需求。這樣做的好處是,可以降低客戶端與接口之間的耦合度,提高代碼的靈活性和可維護性。

????????舉個例子,假設我們有一個電商網站,其中有一個Product類用于處理商品相關的邏輯。按照接口隔離原則,我們應該將Product類的接口拆分成多個更小的接口,比如IProductInfo和IProductReview。這樣,客戶端只需要依賴于它們所需的接口,而不需要依賴整個Product類的接口。

????????這樣做的好處是,當我們需要在客戶端中使用商品信息時,只需要實現IProductInfo接口即可,而不需要關心其他不需要的方法。同樣,當我們需要在客戶端中使用商品評價時,只需要實現IProductReview接口即可。

????????通過接口隔離原則,我們可以避免客戶端依賴于不需要的接口,減少了對無用方法的依賴,提高了代碼的可讀性和可維護性。同時,接口隔離原則也促進了代碼的復用,因為我們可以根據需要選擇實現不同的接口。

總結起來,接口隔離原則的核心思想是:客戶端不應該依賴于它不需要的接口。通過拆分龐大的接口,只提供客戶端所需的精確接口,可以降低耦合度,提高代碼的靈活性和可維護性

👑迪米特法則

????????迪米特法則,也被稱為最少知識原則,它告訴我們一個對象應該盡量減少與其他對象之間的交互,只與直接的朋友進行通信。

????????通俗地說,迪米特法則就是要求我們在設計代碼時,盡量降低對象之間的耦合度,避免一個對象過多地了解其他對象的內部細節。這樣做的好處是,可以提高代碼的可維護性和靈活性,減少對其他對象的依賴。

????????舉個例子,假設我們有一個電商網站,其中有一個Order類用于處理訂單相關的邏輯。按照迪米特法則,我們應該盡量減少Order類與其他類的直接交互,只與必要的對象進行通信,比如與Product類、Payment類等直接相關的對象。

????????這樣做的好處是,當需要修改或者擴展系統的某個功能時,我們只需要關注與之直接相關的對象,而不需要考慮其他無關的對象。這樣可以降低代碼的復雜度,提高代碼的可讀性和可維護性。

????????另外,迪米特法則還鼓勵使用中間對象來協調其他對象之間的交互,以減少對象之間的直接依賴關系。這樣可以提高系統的靈活性,降低耦合度。

????????總結起來,迪米特法則的核心思想是:一個對象應該盡量減少與其他對象之間的交互,只與直接的朋友進行通信。通過降低對象之間的耦合度,可以提高代碼的可維護性和靈活性,減少對其他對象的依賴。

👑合成復用原則

????????合成復用原則告訴我們在設計代碼時,應該優先使用組合(composition)而不是繼承(inheritance)來實現復用。

????????通俗地說,合成復用原則就是要求我們通過將已有的類組合起來,構建新的類來實現復用,而不是通過繼承已有的類。這樣做的好處是,可以減少類之間的耦合度,提高代碼的靈活性和可維護性。

????????舉個例子,假設我們有一個電商網站,其中有一個Order類用于處理訂單相關的邏輯。按照合成復用原則,我們應該優先使用組合來實現訂單的功能,而不是通過繼承已有的類。

????????具體來說,我們可以定義一個Order類,然后在該類中使用其他已有的類,比如Product類和Payment類,作為其成員變量。這樣,Order類就可以通過調用這些成員變量的方法來實現自己的功能,而不需要繼承這些類。

????????這樣做的好處是,當我們需要修改或者擴展系統的某個功能時,只需要關注與之相關的類,而不需要影響到其他類。同時,由于使用了組合而不是繼承,我們可以更加靈活地選擇和替換成員變量,以滿足不同的需求。

總結起來,合成復用原則的核心思想是:優先使用組合而不是繼承來實現復用。通過將已有的類組合起來構建新的類,可以降低耦合度,提高代碼的靈活性和可維護性。

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

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

相關文章

一些Git Repo

文章目錄 Fake-TcpWow Fishing Script模擬券商柜臺 Fake-Tcp Fake-Tcp 自己寫的一個偽裝包測試。 嘗試把UDP的包偽裝成TCP包,再發送到Internet Wow Fishing Script 魔獸世界釣魚腳本 自己寫的魔獸世界釣魚腳本,10.0初期釣魚成功率90%以上。現在關服了…

基于Spring Boot的高校圖書館管理系統的設計與實現(Java+spring boot+MySQL)

獲取源碼或者論文請私信博主 演示視頻: 基于Spring Boot的高校圖書館管理系統的設計與實現(Javaspring bootMySQL) 使用技術: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java sp…

關于ChatGPT抽樣調查:78%的人用于搜索,30%的人擔心因它失業

人工智能早已不再被視為未來科技,而是越來越多地應用在時下人們的生活之中。根據DECO PROTESTE的調查,大約72%的葡萄牙人認為人工智能已經活躍于他們的日常。[1] 隨著ChatGPT對各個行業的影響,也引發了人們關于這種人工智能模型潛力的爭論&a…

c++模板的原理與使用

C中實現代碼復用有兩個方式:類的繼承(即實現了多態),以及模板的使用。這里介紹的模板的知識。 模板的目的: 同樣的代碼適用于不同類型下的使用,實現代碼的復用目的。 模板的原理: 編譯階段&am…

Cygwin 配置C/C++編譯環境以及如何編譯項目

文章目錄 一、安裝C、C編譯環境需要的包1. 選擇gcc-core、gcc-g2. 選擇gdb3. 選擇mingw64下的gcc-core、gcc-g4. 選擇make5. 選擇cmake6. 確認更改7. 查看包安裝狀態 二、C、C 項目編譯示例step1:解壓縮sed-4.9.tar.gzstep2:執行./configure生成Makefile…

shell之正則表達式及三劍客grep命令

一、正則表達式概述 什么是正則表達式? 正則表達式是一種描述字符串匹配規則的重要工具 1、正則表達式定義: 正則表達式,又稱正規表達式、常規表達式 使用字符串描述、匹配一系列符合某個規則的字符串 正則表達式 普通字符: 大小寫字母…

opencv視頻截取每一幀并保存為圖片python代碼CV2實現練習

當涉及到視頻處理時,Python中的OpenCV庫提供了強大的功能,可以方便地從視頻中截取每一幀并將其保存為圖片。這是一個很有趣的練習,可以讓你更深入地了解圖像處理和多媒體操作。 使用OpenCV庫,你可以輕松地讀取視頻文件&#xff0…

判斷推理 -- 圖形推理 -- 位置規律

一組圖:從前往后找規律。 二組圖:從第一組圖找規律,第二組圖應用規律。 九宮格: 90%橫著看找規律,第一行找規律,第二行驗證規律,第三行應用規律。 所有有元素組成都是線,三角形&…

面試熱題(驗證二叉搜索樹)

給你一個二叉樹的根節點 root ,判斷其是否是一個有效的二叉搜索樹。 有效 二叉搜索樹定義如下: 節點的左子樹只包含 小于 當前節點的數。節點的右子樹只包含 大于 當前節點的數。所有左子樹和右子樹自身必須也是二叉樹 二叉樹滿足以上3個條件&#xff0c…

spark的使用

spark的使用 spark是一款分布式的計算框架,用于調度成百上千的服務器集群。 安裝pyspark # os.environ[PYSPARK_PYTHON]解析器路徑 pyspark_python配置解析器路徑 import os os.environ[PYSPARK_PYTHON]"D:/dev/python/python3.11.4/python.exe"pip inst…

喜盈門、夢百合競相入局,智能床墊起風了

配圖來自Canva可畫 現代人的生活壓力普遍大,熬夜、失眠是常有的事,提高睡眠質量十分的重要。近些年來,市面上出現了許多輔助睡眠的產品,比如香薰、褪黑素、蒸汽眼罩、降噪耳塞、助眠枕、睡眠監測app等助眠神器。可以說為了睡個好…

【CLion + ROS2】在 clion 中編譯調試 ros2 package

目錄 0 背景1. 命令行編譯 ros2 package2. 使用 clion 打開 ros2 工程3. 使用 clion 編譯整個 ros2 工程3.1 使用 clion 的 external tool 配置 colcon build3.2 開始編譯 dev_ws 工程3.3 編譯結果: 4. 調試單獨的 ros2 package4.1 創建 ros2 package 的獨立的 colc…

【Git】版本控制器詳解之git的概念和基本使用

版本控制器git 初始Gitgit的安裝git的基本使用初始化本地倉庫配置本地倉庫三區協作添加---add修改文件--status|diff版本回退--reset撤銷修改刪除文件 初始Git 為了能夠更?便我們管理不同版本的?件,便有了版本控制器。所謂的版本控制器,就是?個可以記…

yolo源碼注釋2——數據集配置文件

代碼基于yolov5 v6.0 目錄: yolo源碼注釋1——文件結構yolo源碼注釋2——數據集配置文件yolo源碼注釋3——模型配置文件yolo源碼注釋4——yolo-py 數據集配置文件一般放在 data 文件夾下的 XXX.yaml 文件中,格式如下: path: # 數據集存放路…

基于ssm+vue的新能源汽車在線租賃管理系統源碼和論文PPT

基于ssmvue的新能源汽車在線租賃管理系統源碼和論文PPT010 開發環境: 開發工具:idea 數據庫mysql5.7(mysql5.7最佳) 數據庫鏈接工具:navcat,小海豚等 開發技術:java ssm tomcat8.5 摘 要 隨著科學技術的飛速發展&#xff0…

Ajax及前端工程化

Ajax:異步的js與xml。 作用: 1、通過ajax給服務器發送數據,并獲得其響應的數據。 2、可以在不更新整個網頁的情況下,與服務器交換數據并更新部分網頁的技術。 一、同步與異步 二、原生Ajax 1、準備數據地址 2、創建XMLHttpReq…

SCSS的基本用法

1、聲明變量 $ 聲明變量的符號 $ 下面這張圖左半部分是scss的語法,右半部分是編譯后的css。(整篇文章皆是如此) 2、默認變量 !default sass 的默認變量僅需要在值后面加上 !default 即可。 如果分配給變量的值后面添加了 !default 標志…

Qt 雜項(Qwt、樣式等)

Qt隱藏窗口邊框 this->setWindowFlags(Qt::FramelessWindowHint);Qt模態框 this->setWindowModality(Qt::ApplicationModal);QLable隱藏border 代碼中設置 lable->setStyleSheet("border:0px");或者UI中直接設置樣式:“border:0px” Qwt開源…

JS實現樹形結構、一維數組以及map之間的轉換

const treeData[ {id:1, name:中國, children:[ {id:11,name:河南省,children:[{id:111,name:南陽市,children:[{id:1111,name:淅川縣,children:null}]},{id:112,name:鄭州市,children:[{id:1121,name:中牟縣,children:null}]}] }, {id:22,name:廣東省,children:[{id:221,name:…