突破编程_C++_设计模式(组合模式)

概念

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表现“整体-部分”的层次关系。组合能让客户以一致的方式处理个别对象以及对象组合。

组合模式在以下情况下特别有用:

  • 当你希望客户端代码以相同的方式处理简单对象和复杂对象时。
  • 当你希望以一种组织结构的方式来表示对象的部分-整体层次结构。

在C++中实现组合模式,你可以定义一个抽象的组件类,它可以包含某些被子组件共享的通用接口。然后,你可以定义具体的组件类,它们可以是叶子节点,也可以是容器节点,容器节点可以包含其他组件。

以下是一个简单的例子:

这个例子中,Component 是一个抽象类,它定义了所有组件共有的接口。Leaf 类实现了 Component 的接口,并且表示叶子节点,它不包含任何子组件。Composite 类同样实现了 Component 的接口,并且可以包含子组件。在 main 函数中,我们创建了一个由叶子节点和容器节点组成的简单组件结构,并展示了这些组件。最后,我们删除了所有创建的对象以释放资源。

#include <iostream>
#include <vector>
 
// 抽象组件类
class Component {
public:
    virtual ~Component() {}
    virtual void Add(Component*) {}
    virtual void Remove(Component*) {}
    virtual void Display(int) const = 0;
};
 
// 叶子组件类
class Leaf : public Component {
public:
    void Display(int indent) const override {
        std::cout << std::string(indent, '-') << " Leaf" << std::endl;
    }
};
 
// 容器组件类
class Composite : public Component {
public:
    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());
    }
 
    void Display(int indent) const override {
        std::cout << std::string(indent, '-') << " Composite" << std::endl;
        for (const auto& child : children) {
            child->Display(indent + 2);
        }
    }
 
private:
    std::vector<Component*> children;
};
 
int main() {
    // 创建组件
    Composite* root = new Composite();
    root->Add(new Leaf());
 
    Composite* branch = new Composite();
    branch->Add(new Leaf());
    branch->Add(new Leaf());
 
    root->Add(branch);
    root->Add(new Leaf());
 
    // 显示组件
    root->Display(2);
 
    // 清理资源
    delete root;
    delete branch;
 
    return 0;
}

使用图形和图形集合作为示例:

#include <iostream>
#include <vector>

// 组件基类
class Graphic {
public:
    virtual void draw() = 0;
};

// 叶子节点类: 线条
class Line : public Graphic {
public:
    void draw() override {
        std::cout << "Drawing Line" << std::endl;
    }
};

// 叶子节点类: 圆形
class Circle : public Graphic {
public:
    void draw() override {
        std::cout << "Drawing Circle" << std::endl;
    }
};

// 容器节点类: 图形集合
class Picture : public Graphic {
private:
    std::vector<Graphic*> graphics;

public:
    void add(Graphic* graphic) {
        graphics.push_back(graphic);
    }

    void draw() override {
        std::cout << "Drawing Picture:" << std::endl;
        for (Graphic* graphic : graphics) {
            graphic->draw();
        }
    }
};

int main() {
    Line* line = new Line();
    Circle* circle = new Circle();

    Picture* picture = new Picture();
    picture->add(line);
    picture->add(circle);

    picture->draw();

    delete line;
    delete circle;
    delete picture;

    return 0;
}

在这个示例中,我们创建了Graphic基类,并从中派生了LineCircle作为叶子节点,以及Picture作为容器节点。然后我们演示了如何将叶子节点和容器节点组合成一个树形结构,并以统一的方式进行处理和绘制。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值