当前位置: 首页 > news >正文

23种设计模式 - 桥接模式

模式定义

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


模式结构

抽象部分(Abstraction)

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

适用场景

数控系统开发:硬件控制器(如运动控制卡)与软件逻辑(如G代码解析)解耦。
跨平台支持:同一功能在不同控制器品牌上的差异化实现。
多维变化:如机床类型(铣床/车床)与控制协议(Modbus/EtherCAT)独立扩展。


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

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

#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个类。

相关文章:

  • Excel核心函数VLOOKUP全解析:从入门到精通
  • 【第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025】网络安全,人工智能,数字经济的研究
  • LeetCode--236. 二叉树的最近公共祖先
  • jetbrains IDEA集成大语言模型
  • java练习(32)
  • [Qt] 使用QUndoStack运行到cmd->isObsolete()崩溃
  • 【Axure 模版素材】数据可视化驾驶舱+图表素材 - AxureMost
  • numpy(02 数据类型和数据类型转换)
  • “深入浅出”系列之C++:(22)asio库
  • 服务器部署基于Deepseek的检索增强知识库
  • 嵌入式硬件篇---常用的汇编语言指令
  • Mini-Omni2
  • java防抖,防止表单重复提交,aop注解形式
  • deepseek帮我设计物理量采集单片机口保护电路方案
  • 什么是Baklib云内容中台?
  • chrome V3插件开发,调用 chrome.action.setIcon,提示路径找不到
  • 操作系统2.4
  • 虚拟环境下Python调用C++开发的dll如何联调?一文解答!(Python开发环境PyCharm,C++开发环境Visual Studio)
  • Python JSON的深度解析:从基础到应用
  • 【用deepseek实现快递查询】快递物流查询-快递查询-快递查询-快递物流查询-快递物流轨迹查询-快递物流查询接口-快递查询-快递物流查询
  • 首次采用“顶置主星+侧挂从星”布局,长二丁“1箭12星”发射成功
  • KPL“王朝”诞生背后:AG和联赛一起迈向成熟
  • 西安市未央区委书记刘国荣已任西咸新区党工委书记
  • AI含量非常高,2025上海教育博览会将于本周五开幕
  • 特朗普访中东绕行以色列,专家:凸显美以利益分歧扩大
  • 王毅人民日报撰文:共商发展振兴,共建中拉命运共同体