23种设计模式 - 桥接模式

模式定义

桥接模式(Bridge Pattern)是一种结构型设计模式,其核心是通过将抽象与实现分离,使两者可以独立扩展和变化。该模式通过组合替代继承,有效解决多维变化场景下的类爆炸问题,尤其适用于数控系统中硬件控制与软件逻辑解耦的场景。


模式结构

抽象部分(Abstraction)

  • 定义高层的控制逻辑(如机床操作),并持有实现部分的引用。
    扩展抽象(Refined Abstraction)
  • 对抽象部分的扩展(如铣床、车床等具体机床类型)。
    实现接口(Implementor)
  • 定义底层操作的接口(如控制器指令执行)。
    具体实现(Concrete Implementor)
  • 实现接口的具体类(如西门子、发那科控制器)。

适用场景

数控系统开发:硬件控制器(如运动控制卡)与软件逻辑(如G代码解析)解耦。

跨平台支持:同一功能在不同控制器品牌上的差异化实现。

多维变化:如机床类型(铣床/车床)与控制协议(Modbus/EtherCAT)独立扩展。


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

场景说明:

数控机床需要支持多种类型(铣床、车床)和不同品牌的控制器(西门子、发那科)。使用桥接模式分离机床操作与底层控制逻辑。

cpp 复制代码
#include 
#include 

// 实现接口:控制器协议
class Controller {
public:
    virtual ~Controller() = default;
    virtual void moveTo(float x, float y) = 0;
    virtual void startSpindle() = 0;
};

// 具体实现:西门子控制器
class SiemensController : public Controller {
public:
    void moveTo(float x, float y) override {
        std::cout << "[西门子] 运动到坐标(" << x << ", " << y << ")\n";
    }
    void startSpindle() override {
        std::cout << "[西门子] 主轴启动,转速2000rpm\n";
    }
};

// 具体实现:发那科控制器
class FanucController : public Controller {
public:
    void moveTo(float x, float y) override {
        std::cout << "[发那科] 移动到坐标(" << x << ", " << y << ")\n";
    }
    void startSpindle() override {
        std::cout << "[发那科] 主轴启动,转速1500rpm\n";
    }
};

// 抽象部分:数控机床
class Machine {
protected:
    std::unique_ptr controller;
public:
    Machine(std::unique_ptr ctrl) : controller(std::move(ctrl)) {}
    virtual void processPart() = 0;
    virtual ~Machine() = default;
};

// 扩展抽象:铣床
class MillingMachine : public Machine {
public:
    using Machine::Machine;  // 继承构造函数
    void processPart() override {
        controller->startSpindle();
        controller->moveTo(10.5, 20.3);
        std::cout << "铣削加工中...\n";
    }
};

// 扩展抽象:车床
class LatheMachine : public Machine {
public:
    using Machine::Machine;
    void processPart() override {
        controller->startSpindle();
        controller->moveTo(5.0, 0);
        std::cout << "车削加工中...\n";
    }
};

// 客户端使用
int main() {
    // 西门子控制铣床
    auto siemensMill = std::make_unique(
        std::make_unique()
    );
    siemensMill->processPart();

    // 发那科控制车床
    auto fanucLathe = std::make_unique(
        std::make_unique()
    );
    fanucLathe->processPart();
    
    return 0;
}

输出结果

复制代码
[西门子] 主轴启动,转速2000rpm
[西门子] 运动到坐标(10.5, 20.3)
铣削加工中...
[发那科] 主轴启动,转速1500rpm
[发那科] 移动到坐标(5, 0)
车削加工中...

优势分析

解耦硬件与软件:新增控制器品牌(如三菱)只需扩展Controller,无需修改机床类。

灵活组合:铣床可自由切换西门子/发那科控制器,运行时动态绑定。

避免类爆炸:若使用继承,M种机床×N种控制器需M×N个类;桥接模式仅需M+N个类。

相关推荐
杨充31 分钟前
10.可测试性实战设计
设计模式·开源·代码规范
杨充40 分钟前
9.重构十二式的实战
设计模式·开源·代码规范
杨充1 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充1 小时前
2.面向对象的特性
设计模式
杨充1 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充1 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充1 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯4 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯13 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式