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& 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)

复合对象持有子组件列表,重写添加、删除和遍历方法,调用时会递归传递到所有子节点。

立即学习“C++免费学习笔记(深入)”;

class Composite : public Component {private:    std::vector children_;

public:void operation() const override {std::cout <operation();}}

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& getChildren() const override {    return children_;}bool isComposite() const override { return true; }

};

客户端使用示例

客户端无需区分叶子和复合对象,统一通过 Component 接口操作。

int main() {    Component* leaf1 = new Leaf();    Component* leaf2 = new Leaf();    Component* composite = new Composite();
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++设计模式与组合模式实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1484724.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 08:18:30
下一篇 2025年12月19日 08:18:49

相关推荐

发表回复

登录后才能评论
关注微信