23种设计模式 - 组合模式

模式定义

组合模式(Composite Pattern)是一种结构型设计模式,通过将对象组织成树形结构,使客户端能够以统一的方式处理单个对象和组合对象。该模式特别适用于需要表示"部分-整体"层次结构的场景,例如数控系统中的多级组件管理。


模式结构

Component(抽象构件)

  • 定义所有对象的公共接口(如Operation()),声明管理子组件的方法(如Add()、Remove())。
    Leaf(叶子节点)
  • 表示树中的叶子对象,无子节点,实现Component接口的具体操作。
    Composite(组合节点)
  • 存储子组件集合,实现Component接口,并管理子组件的增删及递归操作。

适用场景

数控系统组件管理:如机床系统包含主轴、导轨、工作台等子组件,工作台又包含多个轴。

统一操作接口:客户端无需区分单个部件(如电机)与组合部件(如多轴联动系统)。

动态树形结构:支持运行时动态添加或移除组件(如更换刀具库)。


C++示例(数控系统场景)

场景说明:

设计一个数控机床系统,包含主轴、导轨等叶子节点,以及可嵌套的工作台组合节点,支持统一启停操作。

cpp 复制代码
#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
导轨初始化,开始运动
=== 启动数控机床 ===
导轨初始化,开始运动
导轨初始化,开始运动
=== 停止数控机床 ===
导轨停止运动
导轨停止运动
=== 停止数控机床 ===
主轴停止
导轨停止运动

优势与扩展

统一接口:客户端无需区分叶子和组合节点,简化调用逻辑。

灵活扩展:新增组件类型(如刀具库)无需修改现有代码。

动态结构:运行时自由组装复杂系统(如多轴协同工作)。

相关推荐
geovindu2 小时前
rust: Facade Pattern
开发语言·后端·设计模式·rust·外观模式
怕浪猫4 小时前
面试官让我手写一个 Tool Use,我用了 3 种方案
设计模式·面试·程序员
geovindu20 小时前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Hill Climbing Loop(2026 最新版)
人工智能·python·设计模式
晚安code2 天前
设计模式入门:吃透 SOLID 原则与迪米特法则,再学 5 个高频模式
后端·设计模式
染指11102 天前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
路弥行至3 天前
【Head First 设计模式】第 2 章:观察者模式 —— 用现代 C++ 重新解读“交互对象的松耦合
c++·经验分享·笔记·观察者模式·设计模式·入门教程·headfirst
YYYing.3 天前
【设计模式系列 (九) 】装饰器模式
c++·后端·设计模式·装饰器模式·c/c++
沫璃染墨3 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构