在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…