模式定义
组合模式(Composite Pattern)是一种结构型设计模式,通过将对象组织成树形结构,使客户端能够以统一的方式处理单个对象和组合对象。该模式特别适用于需要表示“部分-整体”层次结构的场景,例如数控系统中的多级组件管理。
模式结构
Component(抽象构件)
- 定义所有对象的公共接口(如
Operation()
),声明管理子组件的方法(如Add()
、Remove()
)。
Leaf(叶子节点) - 表示树中的叶子对象,无子节点,实现Component接口的具体操作。
Composite(组合节点) - 存储子组件集合,实现Component接口,并管理子组件的增删及递归操作。
适用场景
数控系统组件管理:如机床系统包含主轴、导轨、工作台等子组件,工作台又包含多个轴。
统一操作接口:客户端无需区分单个部件(如电机)与组合部件(如多轴联动系统)。
动态树形结构:支持运行时动态添加或移除组件(如更换刀具库)。
C++示例(数控系统场景)
场景说明:
设计一个数控机床系统,包含主轴、导轨等叶子节点,以及可嵌套的工作台组合节点,支持统一启停操作。
#include
#include
#include
// 抽象构件:设备组件
class DeviceComponent {
public:
virtual ~DeviceComponent() = default;
virtual void start() = 0;
virtual void stop() = 0;
virtual void add(std::shared_ptr component) {} // 透明式设计
virtual void remove(std::shared_ptr component) {}
};
// 叶子节点:主轴
class Spindle : public DeviceComponent {
public:
void start() override { std::cout << "主轴启动,转速2000rpm\n"; }
void stop() override { std::cout << "主轴停止\n"; }
};
// 叶子节点:直线导轨
class LinearRail : public DeviceComponent {
public:
void start() override { std::cout << "导轨初始化,开始运动\n"; }
void stop() override { std::cout << "导轨停止运动\n"; }
};
// 组合节点:数控机床系统
class CNCMachine : public DeviceComponent {
private:
std::vector> components;
public:
void start() override {
std::cout << "=== 启动数控机床 ===\n";
for (auto& comp : components) comp->start();
}
void stop() override {
std::cout << "=== 停止数控机床 ===\n";
for (auto& comp : components) comp->stop();
}
void add(std::shared_ptr comp) override {
components.push_back(comp);
}
void remove(std::shared_ptr comp) override {
components.erase(std::remove(components.begin(), components.end(), comp), components.end());
}
};
// 客户端使用
int main() {
auto spindle = std::make_shared();
auto rail = std::make_shared();
auto workTable = std::make_shared();
workTable->add(std::make_shared());
workTable->add(std::make_shared());
auto machine = std::make_shared();
machine->add(spindle);
machine->add(rail);
machine->add(workTable);
machine->start();
machine->stop();
return 0;
}
代码解析
Component(DeviceComponent)
- 定义
start()
和stop()
接口,支持透明式组合模式(子类可空实现add/remove
)。
Leaf(Spindle/LinearRail) - 实现具体操作,无子组件管理逻辑。
Composite(CNCMachine) - 存储子组件集合,递归调用子组件的操作,支持动态扩展(如嵌套
workTable
)。
输出示例:
=== 启动数控机床 ===
主轴启动,转速2000rpm
导轨初始化,开始运动
=== 启动数控机床 ===
导轨初始化,开始运动
导轨初始化,开始运动
=== 停止数控机床 ===
导轨停止运动
导轨停止运动
=== 停止数控机床 ===
主轴停止
导轨停止运动
优势与扩展
统一接口:客户端无需区分叶子和组合节点,简化调用逻辑。
灵活扩展:新增组件类型(如刀具库)无需修改现有代码。
动态结构:运行时自由组装复杂系统(如多轴协同工作)。