设计模式C++桥接

本文介绍了C++中桥接模式的应用,通过将遥控器的按钮逻辑与设备功能分离,实现平台无关性和可扩展性。通过BaseRemoteController和AdvancedRemoteController类,展示了如何维护高层逻辑和底层实现的独立性,遵循开闭原则和单一职责原则。
摘要由CSDN通过智能技术生成

设计模式C++桥接

参考视频:【设计模式(完整版)】2.2桥梁_哔哩哔哩_bilibili

分类:(对象)结构型

问题:遥控器和控制的设备属于同一个商品的组成部分.需要一个类能描述这样的商品,描述不同的遥控器和设备.

解决方案:将抽象部分(遥控器中的按钮)与它的实现部分(实现遥控器按钮功能的设备)分离,使他们都可以独立的变化.即使用组合的方式来代替继承,将一个类层次转化为多个相关的类层次,避免单个类层次的失控.在抽象和实现间架起一座桥梁.

1.抽象部分(Abstraction):提供高层控制逻辑,依赖于完成底层实际工作的实现对象.(遥控器)

2.实现部分(Implementation):为所有具体实现声明通用接口.(设备的一些功能)

3.具体实现(Concrete Implementations): 特定于平台的实现代码.(对应电视机或者收音机进行功能实现)

4.精确抽象(Refined Abstraction):提供控制逻辑的变体.(更复杂的遥控器,有一些更多的功能)

5.客户端(Client):仅关心如何与抽象部分合作.但是,客户端需要将抽象对象与一个实现对象连接起来.(遥控器对收音机或者电视机按按钮)

下面给出具体例子(遥控器和设备类图以及代码实现)

优点:

可以创建与平台无关的类和程序.

客户端代码仅与高层抽象部分进行互动,不会接触到平台的详细信息.

开闭原则.可以新增抽象部分和实现部分,且它们之间不会相互影响.

单一职责原则.抽象部分专注于处理高层逻辑,实现部分处理平台细节.

缺点:

对高内聚的类使用该模式可能会让代码更加复杂.

​完整代码:

#include <iostream>
#include <string>
​
//实现
class Device
{
public:
    virtual ~Device() {}
    virtual std::string turnOn() const = 0;
    virtual std::string turnOff() const = 0;
    virtual std::string mute() const = 0;
};
class TV : public Device
{
public:
    ~TV() {}
    std::string turnOn() const override
    {
        return "TV:开机...\n";
    }
    std::string turnOff() const override
    {
        return "TV:关机...\n";
    }
    std::string mute() const override
    {
        return "TV:静音...\n";
    }
};
​
class Radio : public Device
{
public:
    ~Radio() {}
    std::string turnOn() const override
    {
        return "Radio:开机...\n";
    }
    std::string turnOff() const override
    {
        return "Radio:关机...\n";
    }
    std::string mute() const override
    {
        return "Radio:静音...\n";
    }
};
​
//抽象
class BaseRemoteController
{
protected:
    Device* m_implementation;
public:
    ~BaseRemoteController() {}
    BaseRemoteController(Device* implementation) :m_implementation(implementation) {}
public:
    virtual std::string sendTurnOn()
    {
        return "基础遥控器发出TurnOn:"+m_implementation->turnOn();
    }
    virtual std::string sendTurnOff()
    {
        return "基础遥控器发出TurnOff:"+m_implementation->turnOff();
    }
​
};
class AdvancedRemoteController :public BaseRemoteController
{
public:
    ~AdvancedRemoteController() {}
    AdvancedRemoteController(Device* implementation) :BaseRemoteController(implementation) {}
public:
    virtual std::string sendTurnOn()
    {
        return "pro遥控器发出TurnOn:" + m_implementation->turnOn();
    }
    virtual std::string sendTurnOff()
    {
        return "pro遥控器发出TurnOff:" + m_implementation->turnOff();
    }
​
    virtual std::string sendMute()
    {
        return "pro遥控器静音:" + m_implementation->mute();
    }
};
​
​
​
int main()
{
    Radio radio;
    BaseRemoteController baseRC(&radio);
    std::cout<<baseRC.sendTurnOn();
    std::cout << baseRC.sendTurnOff();
    std::cout << "---------------------------------------------" << std::endl;
    TV tv;
    AdvancedRemoteController advancedRC(&tv);
    std::cout << advancedRC.sendTurnOn();
    std::cout << advancedRC.sendTurnOff();
    std::cout << advancedRC.sendMute();
}
​

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值