组合设计模式通过统一接口让客户端一致处理单个与组合对象,适用于树形结构;定义抽象基类Component声明操作接口,叶子节点Leaf仅实现operation(),复合节点Composite重写add/remove/getChild以管理子节点并转发请求,从而实现透明的层次结构操作。
在C++中实现组合设计模式(Composite Pattern),核心目标是让客户端可以统一处理单个对象和组合对象,特别适用于树形结构的场景,比如文件系统、UI控件树、组织架构等。通过定义一致的接口,叶子节点和容器节点对外表现一致。
所有节点,无论是叶子还是容器,都继承自同一个基类。这个基类声明操作接口,如添加、删除、获取子节点以及执行某种行为。
示例代码:
class Component {
public:
virtual ~Component() = default;
virtual void operation() const = 0;
virtual void add(Component* component) {
throw std::runtime_error("Not supported.");
}
virtual void remove(Component* component) {
throw std::runtime_error("Not supported.");
}
virtual Component* getChild(int index) {
throw std::runtime_error("Not supported.");
}
};
叶子节点只实现基本操作,不包含子节点;复合节点维护子节点列表,并将请求转发给它们。
示例代码:
class Leaf : public Component {
public:
void operation() const override {
std::cout << "Leaf operation.\n";
}
};
class Composite : public Component {
private:
std::vector children;
public:
void operation() const override {
std::cout << "Composite operation:\n";
for (const auto& child : children) {
child->operation();
}
}
void add(Component* component) override {
children.push_back(component);
}
void remove(Component* component) override {
children.erase(
std::remove(children.begin(), children.end(), component),
children.end()
);
}
Component* getChild(int index) override {
if (index < 0 || index >= children.size()) return nullptr;
return children[index];
}};
客户端统一调用接口
客户端无需区分是叶子还是容器,直接调用基类接口即可完成操作。
- 构建树结构时,将叶子添加到复合节点中
- 调用 operation() 自动递归执行整个子树
示例用法:
int main() {
Composite root;
Leaf leaf1, leaf2;
Composite subNode;
subNode.add(&leaf1);
root.add(&subNode);
root.add(&leaf2);
root.operation(); // 统一调用,自动遍历
return 0;
}
输出结果:
Composite operation:
Composite operation:
Leaf operation.
Leaf operation.
关键点总结
组合模式成功的关键在于:
- 抽象基类提供通用接口,隐藏内部结构差异
- 容器类实现聚合管理,支持动态增删
- 递归调用使客户端无需关心层级深度
- 适合需要频繁遍历或统一操作树形结构的场景
基本上就这些。只要接口设计清晰,C++中的组合模式能很好地解耦树形结构的操作逻辑。
# c++
# 架构
# 子类
# 递归
# 继承
# 虚函数
# 纯虚函数
# 接口
# 对象
# ui
# 客户端
# 遍历
# 适用于
# 子树
# 重写
# 很好
# 并将
# 不做
# 并向
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
php做exe支持多线程吗_并发处理实现方式【详解】
php485读数据时阻塞怎么办_php485非阻塞读取设置技巧【详解】
如何使用Golang编写单元测试_创建Test函数验证业务逻辑
Windows10系统更新错误0x80070002_Win10自动更新失败手动修复
Win11怎么打开注册表_Windows 11注册表编辑器启动命令【步骤】
Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】
Win11键盘快捷键大全_Windows 11常用高效快捷键汇总【技巧】
获取 PHP 文件最后修改时间的正确方法
Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】
php修改数据怎么改富文本_update更新html内容注意事项【说明】
Win11怎么关闭搜索历史 Win11清除搜索框最近记录【隐私】
Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】
Win10系统更新错误0x80240034怎么办 Win10更新错误解决法【方法】
Win11怎么关闭SmartScreen_禁用Windows Defender筛选器教程【步骤】
php能跑在stm32上吗_php在stm32微控制器上的移植方法【介绍】
Win11怎么关闭系统提示音_Windows11声音方案设为无声教程
Python抽象类与接口设计_规范说明【指导】
Win10系统怎么查看显卡温度_Win10任务管理器GPU温度
c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】
如何在Golang中解压文件_Golang compress/gzip解压操作方法
Mac如何使用听写功能_Mac语音输入打字【效率技巧】
Python多线程使用规范_线程安全解析【教程】
Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】
Windows10系统怎么查看显卡驱动_Win10设备管理器驱动更新
Go 中 := 短变量声明的类型推导机制详解
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何在 Go 后端安全获取并验证前端存储的 JWT?
MAC如何安装Git版本控制工具_MAC开发环境配置与Xcode插件安装【教程】
C++如何获取CPU核心数?(std::thread::hardware_concurrency)
Python对象比较与排序_集合使用说明【指导】
Win11系统占用空间大怎么办 Win11深度瘦身清理指南【优化】
Win11怎么关闭任务栏小组件_Windows11隐藏任务栏天气图标
Windows电脑如何进入安全模式?(多种按键方法)
windows如何测试网速_windows系统网络速度测试方法
php修改数据怎么批量改状态_批量更新status字段值技巧【操作】
如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】
Win11怎么设置触控板手势_Windows11三指四指操作自定义
Python邮件系统自动化教程_批量发送解析与模板应用
PythonDocker高级项目部署教程_多容器管理与CI/CD流水线
Win11怎么关闭系统透明度_Windows11个性化颜色透明效果
Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】
如何使用Golang sync.Map实现并发安全map_避免锁竞争
Windows10无法识别USB设备描述符请求失败_通用串行总线控制器修复
微信企业付款回调PHP怎么接收_处理企业付款异步通知数据教程【教程】
Python字符串处理进阶_切片方法解析【指导】
Win10如何更改网络连接_Windows10以太网属性IP配置
PythonFastAPI项目实战教程_API接口与异步处理实践
Python音视频处理高级项目教程_FFmpegPydub剪辑与特效
Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查
php485返回数据不完整怎么办_php485数据分包重组处理方法【教程】
2025-12-02
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。