【设计模式】结构型模式-桥接模式(Bridge Pattern)


桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与其实现部分分离,使它们可以独立变化。该模式通过组合关系替代继承关系,有效避免多层继承带来的复杂性。

核心概念

  • 抽象部分(Abstraction):定义高层控制逻辑(如设备遥控器)
  • 实现部分(Implementation):定义底层基础操作(如设备本身)
  • 解耦:抽象层通过组合持有实现层引用,而非直接继承

模式组成

  1. 实现接口(Implementation Interface)
  2. 具体实现类(Concrete Implementations)
  3. 抽象基类(Abstraction)
  4. 扩展抽象类(Refined Abstractions)

C++ 实现示例

我们以「设备-遥控器」为例进行说明:

#include <iostream>

// 实现接口:设备基类
class Device {
public:
    virtual void powerOn() = 0;
    virtual void powerOff() = 0;
    virtual void setChannel(int channel) = 0;
    virtual int getChannel() const = 0;
    virtual ~Device() = default;
};

// 具体实现:电视机
class TV : public Device {
    bool isOn = false;
    int currentChannel = 1;
public:
    void powerOn() override {
        isOn = true;
        std::cout << "TV is ON\n";
    }
    
    void powerOff() override {
        isOn = false;
        std::cout << "TV is OFF\n";
    }
    
    void setChannel(int channel) override {
        if(isOn) currentChannel = channel;
        std::cout << "TV channel set to " << channel << "\n";
    }
    
    int getChannel() const override { return currentChannel; }
};

// 具体实现:收音机
class Radio : public Device {
    bool isOn = false;
    int currentChannel = 100;
public:
    void powerOn() override {
        isOn = true;
        std::cout << "Radio is ON\n";
    }
    
    void powerOff() override {
        isOn = false;
        std::cout << "Radio is OFF\n";
    }
    
    void setChannel(int channel) override {
        if(isOn) currentChannel = channel;
        std::cout << "Radio tuned to " << channel << " FM\n";
    }
    
    int getChannel() const override { return currentChannel; }
};

// 抽象基类:遥控器
class RemoteControl {
protected:
    Device* device;  // 桥接关键点:持有实现层引用
public:
    explicit RemoteControl(Device* dev) : device(dev) {}
    virtual ~RemoteControl() { delete device; }
    
    virtual void togglePower() = 0;
    virtual void channelUp() = 0;
    virtual void channelDown() = 0;
};

// 扩展抽象:基础遥控器
class BasicRemote : public RemoteControl {
public:
    using RemoteControl::RemoteControl;
    
    void togglePower() override {
        if(device->getChannel() == 0) {  // 假设0为关闭状态
            device->powerOn();
        } else {
            device->powerOff();
        }
    }
    
    void channelUp() override {
        device->setChannel(device->getChannel() + 1);
    }
    
    void channelDown() override {
        device->setChannel(device->getChannel() - 1);
    }
};

// 扩展抽象:高级遥控器
class AdvancedRemote : public BasicRemote {
public:
    using BasicRemote::BasicRemote;
    
    void mute() {
        std::cout << "Muting device...\n";
        device->setChannel(0);
    }
};

// 使用示例
int main() {
    // 组合不同设备和遥控器
    RemoteControl* tvRemote = new BasicRemote(new TV());
    tvRemote->togglePower();  // 打开电视
    tvRemote->channelUp();    // 频道+1
    
    RemoteControl* radioRemote = new AdvancedRemote(new Radio());
    radioRemote->togglePower();  // 打开收音机
    static_cast<AdvancedRemote*>(radioRemote)->mute();  // 静音
    
    delete tvRemote;
    delete radioRemote;
    
    return 0;
}

关键优势

  1. 解耦抽象与实现:允许独立扩展遥控器和设备类型
  2. 运行时切换:可动态更换连接的设备
  3. 避免继承爆炸:新增设备类型时无需创建遥控器子类
  4. 单一职责原则:分离设备控制和设备操作逻辑

适用场景

  • 需要平台无关的图形界面库
  • 支持多种数据库的ORM框架
  • 不同支付方式与支付渠道的组合
  • 跨平台应用程序开发

模式特点

  • 开放/关闭原则:可独立扩展抽象层和实现层
  • 隐藏实现细节:客户端仅与抽象层交互
  • 增加灵活性:运行时切换实现对象

桥接模式通过建立抽象层和实现层之间的桥梁关系,有效解决了多维度变化的组合问题,是处理复杂系统分层设计的有效手段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴雨日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值