新闻中心
C++怎么实现一个组合模式(Composite)_C++设计模式与组合模式实现
组合模式通过统一接口实现树形结构的“整体-部分”关系,C++中定义Component基类声明操作,Leaf实现个体行为,Composite管理子节点并递归调用,客户端无需区分对象类型,适用于菜单、文件系统等层级场景,推荐使用智能指针管理内存。

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“整体-部分”层次结构。C++中实现组合模式的关键是让容器对象(Composite)和叶子对象(Leaf)拥有相同的接口,这样客户端可以统一处理单个对象和组合对象。
定义公共组件接口
首先要定义一个抽象基类 Component,声明所有组合节点共有的操作,比如添加、删除子节点或执行某种行为。
class Component {
public:
virtual ~Component() = default;
virtual void operation() const = 0;
virtual void add(Component* child) {
throw std::runtime_error("Not supported.");
}
virtual void remove(Component* child) {
throw std::runtime_error("Not supported.");
}
virtual const std::vector<Component*>& getChildren() const {
throw std::runtime_error("Not supported.");
}
virtual bool isComposite() const { return false; }
};
实现叶子节点(Leaf)
叶子节点不包含子节点,只实现自己的行为。它不重写 add/remove 等方法,使用基类默认抛出异常的行为即可。
class Leaf : public Component {
public:
void operation() const override {
std::cout << "Leaf operation.\n";
}
};
实现容器节点(Composite)
复合对象持有子组件列表,重写添加、删除和遍历方法,调用时会递归传递到所有子节点。
class Composite : public Component {
private:
std::vector<Component*> children_;
<p>public:
void operation() const override {
std::cout << "Composite operation:\n";
for (const auto* child : children_) {
child->operation();
}
}</p><pre class='brush:php;toolbar:false;'>void add(Component* child) override {
children_.push_b
ack(child);
}
void remove(Component* child) override {
children_.erase(
std::remove(children_.begin(), children_.end(), child),
children_.end()
);
}
const std::vector<Component*>& getChildren() const override {
return children_;
}
bool isComposite() const override { return true; }};
迷你天猫商城
迷你天猫商城是一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。所有页面均兼容IE10及以上现代浏览器。部署方式1、项目
0
查看详情
客户端使用示例
客户端无需区分叶子和复合对象,统一通过 Component 接口操作。
int main() {
Component* leaf1 = new Leaf();
Component* leaf2 = new Leaf();
Component* composite = new Composite();
<pre class='brush:php;toolbar:false;'>composite->add(leaf1);
composite->add(leaf2);
Component* sub_composite = new Composite();
sub_composite->add(new Leaf());
composite->add(sub_composite);
composite->operation(); // 递归执行所有子节点
// 清理资源(实际项目建议用智能指针)
delete leaf1;
delete leaf2;
delete sub_composite;
delete composite;
return 0;}
基本上就这些。组合模式的核心在于统一接口和递归调用,适用于菜单、文件系统、UI控件树等具有层级结构的场景。注意内存管理,推荐用 std::unique_ptr 替代裸指针提升安全性。
以上就是C++怎么实现一个组合模式(Composite)_C++设计模式与组合模式实现的详细内容,更多请关注其它相关文章!
# 是一种
# 青岛软件开发网络营销推广市价
# 长宁营销推广地址电话查询
# 汉沽网站seo推广方案
# 龙华万江网站建设
# 兴宁seo推广费用
# seo伪需求
# 上海万网网站建设
# 车企营销推广策略研究
# seo基础知识书籍
# seo黑帽快排教程
# ai
# 边缘
# 是一个
# 自己的
# 文件系统
# 重写
# 适用于
# 客户端
# 游戏开发
# 递归
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
zookeeper 都有哪些功能?
小红书网页版入口链接分享 小红书官网直接进
Go语言HTML解析:利用Goquery精准获取指定元素内容
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
Golang如何测试channel通信行为_Golang channel通信测试与分析方法
Lar*el 8 多关键词数据库搜索优化实践
1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
从OpenAI API响应中高效提取生成文本
Excel文件在线转换快速入口 Excel在线格式转换网站
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
2026春节假期票务安排_2026春节放假购票指南
微博网页版主页入口 微博官方网站免登录访问
虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
微信商城在哪里打开【步骤】
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
响应式容器内容自动缩放与宽高比维持教程
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
Python字典中优雅地迭代剩余元素的方法
韩剧圈正版入口页面_韩剧圈官网登录链接
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
解决Tabulator日期时间排序问题的专业指南
163邮箱官方主页登录 直达网易邮箱登录核心页面
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
mc.js官网登录入口 mc.js官方登录入口最新版
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
CSS实现侧边栏导航项全宽圆角悬停背景效果
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
Angular Material 垂直步进器:实现底部到顶部排序的教程
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
微信网页版官方快速登录入口 微信网页版网页版账号直达
CSS Grid如何控制元素对齐_align-items与justify-items组合使用


2025-11-18
浏览次数:次
返回列表
ack(child);
}
void remove(Component* child) override {
children_.erase(
std::remove(children_.begin(), children_.end(), child),
children_.end()
);
}
const std::vector<Component*>& getChildren() const override {
return children_;
}
bool isComposite() const override { return true; }