C++怎么实现一个组合模式(Composite)_C++设计模式与组合模式实现


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

c++怎么实现一个组合模式(composite)_c++设计模式与组合模式实现

组合模式(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_back(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++设计模式与组合模式实现的详细内容,更多请关注其它相关文章!


# 边缘  # 如皋网站优化欢迎来电  # 攀枝花网站推广sem  # 杭州创意网站建设  # 刷关键词排名就选u火21星赞  # 电信营销抖音推广怎么做  # 学seo还有前途吗  # 保定营销网站推广  # 晨光营销推广文案怎么写  # 洛阳关键词排名技术价格  # 玫莉蔻营销推广策略分析  # ai  # 是一个  # 自己的  # 游戏开发  # 如何实现  # 文件系统  # 重写  # 适用于  # 客户端  # 递归  # c++ 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《新三国志曹操传》游历事件袁尚突围攻略  《淘宝联盟》推广自己的店铺方法  铁拳8在线玩 铁拳8在线秒玩入口  Teambition网盘如何共享文件  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  《一起考教师》账号注销方法  解决CSS布局中意外顶部空白问题的教程  《异星探险家》古怪的物品作用介绍  Vue 3中独立响应式实例的创建与应用  PDF如何批量加注释_PDF多文件批注高亮操作教程  J*a实现任务清单管理_集合框架综合入门练手  《随手记》备份数据方法  React应用中Commerce.js数据加载与状态管理最佳实践  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  鼠标没反应了怎么办 无线/有线鼠标失灵的解决方法【详解】  抖音赚钱快速入门_新手必看的抖音赚钱步骤  高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法  在Django中动态检查模型关联:一种灵活的解决方案  Go语言中方法接收器的选择:值类型还是指针类型?  TikTok网页版实时观看入口 TikTok网页版短视频在线浏览  获取WooCommerce产品在后台编辑页面的分类ID  响应式设计中动态背景颜色条的实现指南  iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南  使用jQuery精确检测除指定元素外任意位置的点击事件  济南公交卡手机充值指南  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  b站如何管理订阅_b站订阅标签分类管理  《小宇宙》标记不友善评论方法  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  从J*a应用程序中导出MySQL表数据的技术指南  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  《宝可梦大集结》S4冠军之路开始时间介绍  苹果手机缓存怎么清除_苹果手机缓存如何清除iphone各版本操作步骤  Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】  《kimi智能助手》制作ppt教程  如何测试您的网站全球打开速度-网站海外测速工  《理想汽车》权限管理设置方法  《我的恋爱逃生攻略》中文名字输入方法  多闪电脑版下载_多闪PC端模拟器使用  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  以下哪一项是古代兵书三十六计中的计谋  Python对象引用与属性赋值:理解链表中的行为  b站怎么用微信登录_b站微信登录方法  管理打开的编辑器:固定、分组和关闭技巧  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  rabbitmq 持久化有什么缺点?  c++类和对象到底是什么_c++面向对象编程基础 

 2025-11-18

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.