C++|設計模式(〇)|設計模式的六大原則

這里文章只做簡要描述,作為掃盲

在軟件開發過程中,遵循一定的設計原則可以幫助開發者創建更加靈活、可維護和可擴展的系統。設計模式的六大原則是面向對象設計的核心理念,本文將詳細介紹這些原則,并結合實例說明它們的重要性和應用方法。

文章目錄

  • 單一職責原則(SRP, Single Responsibility Principle)
  • ??開放封閉原則(OCP, Open/Closed Principle)
  • 里氏替換原則(LSP,LisKov Substitution Principle)
  • 接口隔離原則(ISP, Interface Segregation Principle)
  • ??依賴倒置原則(DIP,Dependency Inversion Principle)
  • ??合成復用原則(CARP,Composite/Aggregate Reuse Principle)

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

定義:一個類應該只有一個引起變化的原因。即,一個類只負責一個職責。
意義:遵循單一職責原則,可以提高代碼的可讀性和可維護性,減少代碼的復雜度。

class ReportGenerator {
public:void generateReport() {// 生成報告}
};class ReportPrinter {
public:void printReport() {// 打印報告}
};

在這個示例中,ReportGenerator 負責生成報告,ReportPrinter 負責打印報告,遵循了單一職責原則。

??開放封閉原則(OCP, Open/Closed Principle)

定義:軟件實體應該對外擴展開放,對修改封閉

意義:通過擴展而不是修改現有代碼來實現新的功能,可以提高系統的穩定性和可擴展性。

class Shape {
public:virtual void draw() = 0;
};class Circle : public Shape {
public:void draw() override {// 畫圓}
};class Rectangle : public Shape {
public:void draw() override {// 畫矩形}
};

在這個示例中,通過繼承 Shape 類來擴展新的形狀類,而不需要修改現有的 Shape 類。

里氏替換原則(LSP,LisKov Substitution Principle)

定義:子類應該能夠替換其基類,并且功能不受影響。

意義:確保繼承關系中的子類可以替代基類,保證系統的正確性。

class Bird {
public:virtual void fly() {// 飛行邏輯}
};class Sparrow : public Bird {
public:void fly() override {// 麻雀飛行邏輯}
};

在這個示例中,Sparrow 可以替代 Bird,且系統功能不受影響。

接口隔離原則(ISP, Interface Segregation Principle)

定義:使用多個專門的接口,而不是單一的總接口

意義:減少類之間的依賴,使系統更加靈活和易于維護。

class Printer {
public:virtual void print() = 0;
};class Scanner {
public:virtual void scan() = 0;
};class AllInOnePrinter : public Printer, public Scanner {
public:void print() override {// 打印邏輯}void scan() override {// 掃描邏輯}
};

在這個示例中,Printer 和 Scanner 接口分離,避免了單一接口的臃腫。

??依賴倒置原則(DIP,Dependency Inversion Principle)

定義:高層模塊不應該依賴低層模塊,二者都應該依賴抽象;抽象不應依賴細節,細節應該依賴抽象

意義:通過依賴抽象層來解耦高層和低層模塊,提高系統的靈活性和可維護性。

class Database {
public:virtual void connect() = 0;
};class MySQLDatabase : public Database {
public:void connect() override {// MySQL 連接邏輯}
};class Application {
private:Database& db;
public:Application(Database& db) : db(db) {}void run() {db.connect();// 業務邏輯}
};

在這個示例中,Application 依賴于 Database 抽象接口,而不是具體實現,遵循了依賴倒置原則。

??合成復用原則(CARP,Composite/Aggregate Reuse Principle)

定義:優先使用對象組合而不是繼承來達到復用的目的。

意義:通過組合多個對象來實現新功能,而不是通過繼承,提高系統的靈活性和可復用性。

class Engine {
public:void start() {// 啟動引擎}
};class Car {
private:Engine engine;
public:void drive() {engine.start();// 駕駛邏輯}
};

在這個示例中,Car 通過組合 Engine 對象來實現驅動功能,而不是通過繼承。

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

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

相關文章

Android Studio添加依賴 新版 和 舊版 的添加方式(Gradle添加依賴)(Java)

舊版的(在線添加) 1找 文件 在項目的build.gradle文件中添加依賴(在下面的節點中添加庫 格式 ’ 組 :名字 : 版本號 ‘ ) dependencies {implementation com.example:library:1.0.0 }implementation 組:名字:版本…

【lambdastreammaven】

lambda 匿名函數 為了簡化java中的匿名內部類 事件監聽 寫一個類 實現 ActionListener 接口 (外部類) | | 內部類 類在其他地方用不到, 索性就把這個類定義在類的內部使用 好處: 1.內部可以使用外部類的成員 …

互聯網十萬個為什么之什么是分布式計算?

分布式計算是一種計算方法,它將計算任務分散到多個物理或邏輯上分開的計算機(稱為節點)上執行,這些節點通過網絡互連并協作完成共同的目標。每個節點具備獨立的處理能力和存儲資源,在分布式系統中,它們共享…

論文閱讀--CLIPasso

讓計算機把真實圖片抽象成簡筆畫,這個任務很有挑戰性,需要模型捕獲最本質的特征 以往的工作是找了素描的數據集,而且抽象程度不夠高,筆畫是固定好的,素描對象的種類不多,使得最后模型的效果十分受限 之所以…

小米財報:業績遠超預期,汽車推著手機跑!

隨著一季度財報陸續出爐,企業間的分化越來越明顯。 新環境下,很多公司都陷入停滯時,去討論“掉隊”已經沒有多少意義,現在真正值得我們關注的,是那些在逆風情況下,還能“領先”的企業。毫無疑問&#xff0…

ES集群性能優化參考建議

Elasticsearch(ES)集群性能優化是一個多方面的任務,涉及硬件、配置、查詢優化等多個方面。以下是一些建議,幫助你優化Elasticsearch集群的性能: 1. 硬件優化 內存:確保分配給Elasticsearch的內存足夠大&a…

C++|設計模式(三)|抽象工廠模式

抽象工廠模式仍然屬于創建型模式,我們在【簡單工廠和工廠方法模式】這篇文章中,描述了簡單工廠和工廠方法模式,并在文末,簡單介紹了工廠方法模式的局限性。 本文將通過汽車工廠的例子繼續來闡述使用抽象工廠模式相比較于工廠方法…

Linux修煉之路之馮系結構,操作系統

目錄 一:馮諾依曼體系結構 1.五大組件 2.存儲器存在的意義 3.幾個問題 二:操作系統 接下來的日子會順順利利,萬事勝意,生活明朗-----------林辭憂 一:馮諾依曼體系結構 我們當代的計算機的基本構成都是由馮諾依曼…

Kubernetes 容器編排

應用程序部署演變 主要有三個演變: 傳統部署:互聯網早期,會直接將應用程序部署在物理機上 優點:簡單,不需要其它技術的參與 缺點:不能為應用程序定義資源使用邊界,很難合理地分配計算資源&…

【開源】多語言大型語言模型的革新:百億參數模型超越千億參數性能

大型人工智能模型,尤其是那些擁有千億參數的模型,因其出色的商業應用表現而受到市場的青睞。但是,直接通過API使用這些模型可能會帶來數據泄露的風險,尤其是當模型提供商如OpenAI等可能涉及數據隱私問題時。私有部署雖然是一個解決…

PY32F003+RTL8710(AT) 實現獲取天氣情況

一、RTL8710主要AT指令 1、ATSR:模塊重啟 2、ATSE1:開啟回顯 3、ATPW1:station模式 4、ATPNssid,password,,:連接到AP 5、ATPK1:設置自動接收 6、ATPC0,v1.yiketianqi.com,80:與網站建立TCP連接 7、ATPT125…

關于pytorch加載模型報錯問題

load_net[“params”] 報keyerror 加載模型后查看對應參數是什么 model2 torch.load(m1_path "xxx.pth") print(model1.keys())若輸出如下: 已經有相應參數不需要執行 load_net[“params”]若輸出如下 則需要load_net[“params”]

Linux-命令上

at是一次性的任務,crond是循環的定時任務 如果 cron.allow 文件存在,只有在文件中出現其登錄名稱的用戶可以使用 crontab 命令。root 用戶的登錄名必須出現在 cron.allow 文件中,如果這個文件存在的話。系統管理員可以明確的停止一個用戶&am…

3D 生成重建014-Bidiff使用二維和三維先驗的雙向擴散

3D 生成重建014-Bidiff使用二維和三維先驗的雙向擴散 文章目錄 0 論文工作1 論文方法2 效果 0 論文工作 大多數三維生成研究集中在將二維基礎模型向上投影到三維空間中,要么通過最小化二維評分蒸餾采樣(SDS)損失,要么通過對多視圖…

判斷變量是否為數組的幾種方法

1、isArray 方法 isArray() 方法用于判斷一個對象是否為數組。如果對象是數組返回 true,否則返回 false。 Array.isArray(arr); // true 1 2、對象原型 通過原型鏈判斷是否具有和數組同一原型鏈的頂端。 arr.__proto__ Array.prototype; // true 1 3、instanceof…

[數據結構] -- 雙向循環鏈表

🌈 個人主頁:白子寰 🔥 分類專欄:C打怪之路,python從入門到精通,數據結構,C語言,C語言題集👈 希望得到您的訂閱和支持~ 💡 堅持創作博文(平均質量分82)&#…

一文理清database/sql包的使用場景和宕機查詢流程

一文理清database/sql包你可能遇到的問題 那么database/sql包實現了什么功能呢?建立數據庫連接檢測連接是否能ping通通過連接進行具體的sql查詢查詢完將連接進行關閉當數據庫宕掉重啟后再次查詢 database/sql包創建的db連接 對于數據庫宕掉后重啟是否仍然有效&#…

AI繪畫工具:創意與技術的完美融合

隨著人工智能技術的飛速發展,我們見證了無數領域的革新與變革。其中,AI繪畫工具的出現,無疑為藝術界帶來了一股清新的風潮。這些工具以其獨特的魅力,吸引了無數藝術家和創意人士的目光,成為他們表達自我、探索未知的重…

Compose在xml中使用滑動沖突處理

一、背景 在現有Android項目中使用Compose可能存在滑動沖突問題,例如 SmartRefreshLayoutCoordinatorLayoutComposeView(ComposeView這里又是一個LazyColumn) 二、解決方案 官方介紹:https://developer.android.google.cn/develop/ui/compose/touch-inp…

huggingface 筆記:device_map

1 基本映射方法 設計設備映射時,可以讓Accelerate庫來處理設備映射的計算通過設置device_map為支持的選項之一("auto"、 "balanced"、 "balanced_low_0"、 "sequential");或者如果想更精…