【设计模式】组合模式
【设计模式】组合模式
介绍
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。这种模式通过定义一个统一的接口,使得树形结构中的叶子节点和组合节点能够以相同的方式进行处理。
优点
- 一致性:组合模式提供了一种处理单个对象和组合对象的统一方式,使得客户端代码可以一致地处理复杂树形结构和简单对象。
- 灵活性:通过组合模式,你可以方便地添加新类型的组件,而不需要修改现有代码,符合开闭原则(Open-Closed Principle)。
- 简化客户端代码:客户端代码不需要区分处理单个对象和组合对象的方式,降低了代码的复杂性。
适用场景
- 需要表示对象的部分-整体层次结构:当你需要表示一个对象是由多个子对象组成的复杂结构时,组合模式是一个理想的选择。
- 希望客户端统一处理单个对象和组合对象:如果你希望客户端代码在处理单个对象和组合对象时能够使用一致的方式,可以考虑使用组合模式。
- 需要动态地增加或删除对象的组成部分:组合模式允许你在运行时方便地增加或删除组成部分,而不影响其他部分的操作。
代码示例
以下是一个组合模式的C++代码示例,展示了如何使用组合模式来构建一个简单的图形绘制系统:
#include <iostream>
#include <vector>
#include <memory>// 组件接口
class Graphic {
public:virtual void draw() const = 0;virtual ~Graphic() = default;
};// 叶子节点类 - 线
class Line : public Graphic {
public:void draw() const override {std::cout << "Drawing a line." << std::endl;}
};// 叶子节点类 - 圆
class Circle : public Graphic {
public:void draw() const override {std::cout << "Drawing a circle." << std::endl;}
};// 组合节点类 - 图形组合
class CompositeGraphic : public Graphic {
private:std::vector<std::shared_ptr<Graphic>> children;
public:void add(const std::shared_ptr<Graphic>& graphic) {children.push_back(graphic);}void draw() const override {for (const auto& child : children) {child->draw();}}
};int main() {auto line1 = std::make_shared<Line>();auto line2 = std::make_shared<Line>();auto circle = std::make_shared<Circle>();auto composite1 = std::make_shared<CompositeGraphic>();composite1->add(line1);composite1->add(circle);auto composite2 = std::make_shared<CompositeGraphic>();composite2->add(line2);composite2->add(composite1);composite2->draw();return 0;
}
- 组件接口:
Graphic
类是所有具体图形类的基类,定义了一个纯虚函数draw
,要求所有子类必须实现这个函数。 - 叶子节点类:
Line
和Circle
类是具体的图形类,实现了Graphic
接口的draw
方法。 - 组合节点类:
CompositeGraphic
类是一个组合节点,它可以包含多个Graphic
对象(无论是Line
、Circle
还是其他CompositeGraphic
),并且实现了draw
方法,调用所有子节点的draw
方法。 - 客户端代码:在
main
函数中,创建了多个叶子节点和组合节点,通过组合模式构建了一个树形结构,并调用组合节点的draw
方法来绘制整个图形。
通过这个示例,你可以看到组合模式如何使得客户端代码能够统一处理单个对象和组合对象,简化了复杂对象结构的处理。