c++的可擴展性方法

在C++編碼中,"方便擴展"通常指的是代碼設計具有良好的**可維護性、可重用性和靈活性**,能夠在不修改原有代碼或僅少量修改的情況下,輕松添加新功能、支持新類型或適應新需求。以下是一些典型的、體現“方便擴展”思想的C++編程案例:

?

---

?

### 1. **模板 (Templates) - 支持任意類型**

?

這是C++實現泛型編程的核心,讓代碼可以處理多種數據類型而無需重寫。

?

**案例:實現一個通用的最大值函數**

```cpp

template <typename T>

T max(T a, T b) {

? ? return (a > b) ? a : b;

}

?

// 使用

int i = max(3, 5); // int

double d = max(3.14, 2.71); // double

std::string s = max("hello", "world"); // string

```

?

**擴展性體現:**

- 無需為 `int`、`double`、`std::string` 等每種類型寫一個 `max` 函數。

- 新增自定義類型(如 `Point`)時,只要重載 `>` 操作符,即可直接使用。

?

---

?

### 2. **繼承與多態 (Inheritance & Polymorphism) - 支持新類**

?

通過基類指針操作派生類對象,新增功能只需添加新類,無需修改使用代碼。

?

**案例:圖形繪制系統**

```cpp

class Shape {

public:

? ? virtual void draw() = 0;

? ? virtual ~Shape() = default;

};

?

class Circle : public Shape {

public:

? ? void draw() override { cout << "Drawing Circle\n"; }

};

?

class Rectangle : public Shape {

public:

? ? void draw() override { cout << "Drawing Rectangle\n"; }

};

?

// 擴展:新增 Triangle 類

class Triangle : public Shape {

public:

? ? void draw() override { cout << "Drawing Triangle\n"; }

};

?

// 使用代碼(無需修改)

void renderShapes(const vector<Shape*>& shapes) {

? ? for (auto shape : shapes) {

? ? ? ? shape->draw(); // 自動調用對應 draw()

? ? }

}

```

?

**擴展性體現:**

- 添加新圖形(如 `Triangle`)時,只需新增類,`renderShapes` 函數完全不用改。

?

---

?

### 3. **策略模式 (Strategy Pattern) - 支持新算法**

?

將算法封裝成獨立的類,可以在運行時切換。

?

**案例:排序策略**

```cpp

class SortStrategy {

public:

? ? virtual void sort(vector<int>& data) = 0;

? ? virtual ~SortStrategy() = default;

};

?

class QuickSort : public SortStrategy {

public:

? ? void sort(vector<int>& data) override { /* 快速排序實現 */ }

};

?

class MergeSort : public SortStrategy {

public:

? ? void sort(vector<int>& data) override { /* 歸并排序實現 */ }

};

?

class Context {

? ? SortStrategy* strategy;

public:

? ? void setStrategy(SortStrategy* s) { strategy = s; }

? ? void executeSort(vector<int>& data) { strategy->sort(data); }

};

```

?

**擴展性體現:**

- 要添加 `HeapSort`,只需新增類并繼承 `SortStrategy`,Context 無需修改。

?

---

?

### 4. **工廠模式 (Factory Pattern) - 支持新對象創建**

?

將對象的創建過程封裝起來,新增類型時只需注冊,不改核心邏輯。

?

**案例:GUI控件工廠**

```cpp

class Widget {

public:

? ? virtual void render() = 0;

? ? virtual ~Widget() = default;

};

?

class Button : public Widget { /* ... */ };

class Label : public Widget { /* ... */ };

?

class WidgetFactory {

? ? map<string, function<Widget*()>> creators;

public:

? ? void registerType(const string& name, function<Widget*()> creator) {

? ? ? ? creators[name] = creator;

? ? }

?

? ? Widget* create(const string& type) {

? ? ? ? return creators[type]();

? ? }

};

?

// 使用

WidgetFactory factory;

factory.registerType("button", [](){ return new Button; });

factory.registerType("label", [](){ return new Label; });

?

Widget* btn = factory.create("button"); // 創建按鈕

```

?

**擴展性體現:**

- 添加新控件(如 `TextBox`),只需注冊,`create` 接口不變。

?

---

?

### 5. **觀察者模式 (Observer Pattern) - 支持新事件響應**

?

一個對象狀態改變時,通知所有依賴對象。新增響應者無需修改主體。

?

**案例:事件系統**

```cpp

class EventManager {

? ? vector<function<void()>> listeners;

public:

? ? void subscribe(function<void()> callback) {

? ? ? ? listeners.push_back(callback);

? ? }

?

? ? void notify() {

? ? ? ? for (auto& f : listeners) f();

? ? }

};

?

// 多個模塊可以監聽

EventManager em;

em.subscribe([](){ cout << "Log: Event occurred\n"; });

em.subscribe([](){ saveToFile(); });

em.subscribe([](){ updateUI(); });

?

em.notify(); // 觸發所有回調

```

?

**擴展性體現:**

- 新增監聽邏輯(如發送郵件、寫日志)只需調用 `subscribe`,`notify` 不變。

?

---

?

### 6. **插件式架構 (Plugin Architecture) - 支持動態加載**

?

使用動態庫(`.dll` / `.so`)和接口,運行時加載新功能。

?

**案例:圖像格式支持**

- 主程序定義 `ImageDecoder` 接口。

- 每種格式(PNG、JPEG、WebP)實現為獨立 `.dll`。

- 程序啟動時掃描插件目錄,自動加載并注冊。

?

**擴展性體現:**

- 添加 WebP 支持?只需提供一個 `.dll`,無需重新編譯主程序。

?

---

?

### 總結:如何讓C++代碼“方便擴展”

?

| 技術 | 適用擴展場景 | 關鍵思想 |

|------|--------------|----------|

| **模板** | 新數據類型 | 編譯時泛型 |

| **繼承/多態** | 新子類行為 | 運行時多態 |

| **策略模式** | 新算法 | 封裝變化的算法 |

| **工廠模式** | 新對象創建 | 解耦創建與使用 |

| **觀察者模式** | 新事件響應 | 發布-訂閱機制 |

| **插件架構** | 新功能模塊 | 動態加載 |

?

**核心原則**:**開閉原則 (Open/Closed Principle)** —— 對擴展開放,對修改關閉。

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

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

相關文章

加速車輛開發 風丘道路載荷數據采集 (RLDA) 測試方案

一、背景 整車廠在汽車上市前&#xff0c;了解產品所能承受的載荷是非常重要的&#xff0c;因此需進行道路載荷數據采集&#xff08;RLDA&#xff09;測試。通過獲得車輛在實際試驗場或公路道路中行駛的載荷信息來為整車臺架道路模擬試驗提供目標信號輸入&#xff0c;以及為用于…

大模型0基礎開發入門與實踐:第4章 “腦細胞”的模擬:神經網絡與深度學習入門

第4章 “腦細胞”的模擬&#xff1a;神經網絡與深度學習入門 1. 引言 在上一章&#xff0c;我們像一位偵探&#xff0c;學會了使用決策樹這樣的工具&#xff0c;從清晰的線索&#xff08;花瓣、花萼的尺寸&#xff09;中推理出確定的結論&#xff08;鳶尾花的種類&#xff09;。…

微服務之間的調用關系如何處理,才能防止循環依賴

在微服務架構中&#xff0c;循環依賴是常見的設計問題&#xff0c;可能導致系統部署失敗、啟動順序沖突、故障排查困難等問題。處理循環依賴的核心原則是通過架構設計打破依賴閉環&#xff0c;以下是具體的解決方案&#xff1a; 1. 重新劃分服務邊界&#xff08;根本解決&#…

粗糧廠的基于flink的汽車實時數倉解決方案

基于flink的實時數倉解決方案1 背景2 業務模型1 業務框架2 難點痛點3技術選型1 計算引擎2 中間存儲3 查詢引擎4 flink計算架構設計1 純實時架構2 純實時定期補充離線數據3 純實時定期刷新過期binlog4 lamdba 分字段更新 歷史過期數據刷新5 痛點解決delta joinmerge-enginehol…

Datawhale AI夏令營---coze空間共學

1.進入coze空間 2.點擊免費使用 3.點擊制作播客&#xff0c;微信上面選好鏈接 徹底搞懂深度學習-模型訓練和推理&#xff08;動圖講解&#xff09; 4.運行過程 5.音頻鏈接 https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/sami_podcast…

遙感機器學習入門實戰教程|Sklearn案例⑥:網格搜索與超參數優化

在前幾篇案例中&#xff0c;有同學在后臺留言&#xff1a;“模型的參數到底怎么調&#xff1f;比如 SVM 的 C 和 γ&#xff0c;隨機森林的樹數和深度&#xff0c;要怎么選才能得到最優結果呢&#xff1f;”這是一個非常經典的問題&#xff1a;參數選不好&#xff0c;模型效果差…

論文精讀(三)|智能合約漏洞檢測技術綜述

筆者鏈接&#xff1a;撲克中的黑桃A 專欄鏈接&#xff1a;論文精讀 本文關鍵詞&#xff1a;智能合約;合約安全;合約可靠性;合約質量保障;漏洞檢測;合約程序分析 引 諸位技術同仁&#xff1a; 本系列將系統精讀的方式&#xff0c;深入剖析計算機科學頂級期刊/會議論文&#…

YOLO --- YOLO11模型以及項目詳解

YOLO — YOLO11模型以及項目詳解 文章目錄YOLO --- YOLO11模型以及項目詳解一&#xff0c;開源地址二&#xff0c;重要模塊2.1 C3K22.2 C2PSA2.3 檢測頭三&#xff0c;網絡結構3.1 整體結構劃分3.2 Backbone 結構分析&#xff08;從下往上看&#xff09;3.3 結構分析&#xff0…

Debezium監聽MySQL binlog并實現有狀態重啟

Debezium實現MySQL數據監聽了解Debezium? 本期主要內容實現步驟1. 新建Maven工程2.導入依賴3.核心代碼編寫4.offset的存儲5.OffsetBackingStore實現jdbc模式6.運行結果總結了解Debezium 官網&#xff1a;https://debezium.io/ Debezium是一組分布式服務&#xff0c;用于捕獲數…

InfluxDB 存儲優化:TSM 文件管理與空間回收(一)

一、InfluxDB 與 TSM 文件初相識**在數字化時代&#xff0c;數據量呈爆發式增長&#xff0c;尤其是時間序列數據&#xff0c;如服務器監控指標、傳感器讀數、金融交易記錄等&#xff0c;它們都帶有時間戳&#xff0c;記錄著事物隨時間的變化。InfluxDB 作為一款高性能的開源時序…

macos使用FFmpeg與SDL解碼并播放H.265視頻

效果: 安裝依賴: brew install ffmpeg brew install sdl2 brew install x265 確認x265已啟用 查看x265版本 工程CMakeLists.txt

C#開源庫ACadSharp讀取dwg圖元的示例

文章目錄介紹數據示例讀取圖元屬性介紹 開源庫ACadSharp的地址&#xff1a;https://github.com/DomCR/ACadSharp 可以在NuGet中搜索到該庫并安裝。 數據示例 數據是一個繪制了以下簡單圖元的dwg數據&#xff1a; 讀取圖元屬性 創建了.net6控制臺項目&#xff0c;通過NuG…

【UniApp打包鴻蒙APP全流程】如何配置并添加UniApp API所需的鴻蒙系統權限

一、前言&#xff1a;為什么選擇 UniApp 打包鴻蒙應用&#xff1f; 隨著鴻蒙生態的快速發展&#xff0c;越來越多開發者希望將現有跨平臺項目快速接入鴻蒙系統。而 UniApp 作為國內領先的跨平臺開發框架&#xff0c;憑借其“一次開發&#xff0c;多端發布”的特性&#xff0c;…

STM32-FreeRTOS快速入門指南(下)

第十一章 FreeRTOS事件標志組 1. 事件標志組簡介 事件標志組與信號量一樣屬于任務間同步的機制&#xff0c;但是信號量一般用于任務間的單事件同步&#xff0c;對于任務間的多事件同步&#xff0c;僅使用信號量就顯得力不從心了。 FreeRTOS 提供的事件標志組可以很好的處理多事…

KTH7812磁編碼器芯片完全支持ABZ和UVW輸出模式

KTH7812磁編碼器芯片完全支持ABZ和UVW輸出模式&#xff0c;具體功能細節如下&#xff1a;&#x1f527; 1. ABZ輸出特性 分辨率可編程&#xff1a;支持 4~4096步/圈&#xff08;對應1~1024個脈沖周期/圈&#xff09;&#xff0c;用戶可通過配置寄存器自定義分辨率。 輸出頻率…

Android為ijkplayer設置音頻發音類型usage

官方文檔 多區音頻路由 | Android Open Source Projecthttps://source.android.google.cn/docs/automotive/audio/audio-multizone-routing?hlzh-cn 背景 車機系統開發多分區&#xff08;zone&#xff09;功能&#xff0c;可以實現同一個app通過設置&#xff0c;在不同分…

C++ 循環:從入門到精通的深度解析

《C++ 循環:從入門到精通的深度解析》 目錄 循環的本質與編程價值 三大基礎循環結構詳解 循環控制語句:break與continue的魔法 嵌套循環:構建復雜邏輯的基石 現代C++循環特性(C++11+) 循環性能優化與常見陷阱 實戰案例:算法與工程中的循環應用 面試題深度解析與編程技巧…

| `cat /etc/os-release` | 發行版詳細信息(如 Ubuntu、CentOS) |

在 Linux 或類 Unix 系統中&#xff0c;最簡潔的命令查看操作系統類型是&#xff1a; uname -s? 輸出示例&#xff1a; LinuxDarwin&#xff08;macOS&#xff09;FreeBSD 等&#x1f50d; 說明&#xff1a; uname&#xff1a;顯示系統信息-s&#xff1a;僅顯示操作系統內核名…

Maya 3D建模:點、線、面、創建多邊面

目錄 一 點、線、面 二 創建多邊面 一 點、線、面 鼠標放在模型上 按住鼠標右鍵&#xff1a;就可以選擇點 線 面 shift 加選點線面 ctrl 減選點線面 頂點面&#xff1a;是一個檢查模式&#xff0c;觀察有無錯誤 選擇面&#xff0c;單擊一個面&#xff0c;按住shift鍵 同時…

CXR-LT 2024:一場關于基于胸部X線的長尾、多標簽和零樣本疾病分類的MICCAI挑戰賽|文獻速遞-深度學習人工智能醫療圖像

Title題目CXR-LT 2024: A MICCAI challenge on long-tailed, multi-label, and zero-shotdisease classification from chest X-rayCXR-LT 2024&#xff1a;一場關于基于胸部X線的長尾、多標簽和零樣本疾病分類的MICCAI挑戰賽01文獻速遞介紹CXR-LT系列是一項由社區推動的計劃&a…