一、桥接模式概念
桥接模式 (Bridge) 是一种结构型设计模式, 可将抽象部分与实现部分分离,使它们都可以独立的变化。
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。抽象化角色和具体化角色都应该可以被子类扩展。在这种情况下,桥接模式可以灵活地组合不同的抽象化角色和具体化角色,并独立化地扩展。
设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
适用场景
- 如果你想要拆分或重组一个具有多重功能的庞杂类(例如能与多个数据库服务器进行交互的类),可以使用桥接模式。
- 如果你希望在几个独立维度上扩展一个类, 可使用该模式。
- 如果你需要在运行时切换不同实现方法, 可使用桥接模式。
桥接设计模式的结构:
适配器实现了其中一个对象的接口, 并对另一个对象进行封装。
- 抽象部分 (Abstraction) 提供高层控制逻辑, 依赖于完成底层实际工作的实现对象。
- 实现部分 (Implementation) 为所有具体实现声明通用接口。 抽象部分仅能通过在这里声明的方法与实现对象交互。
- 抽象部分可以列出和实现部分一样的方法, 但是抽象部分通常声明一些复杂行为, 这些行为依赖于多种由实现部分声明的原语操作。
- 具体实现 (Concrete Implementations) 中包括特定于平台的代码。
- 精确抽象 (Refined Abstraction) 提供控制逻辑的变体。 与其父类一样, 它们通过通用实现接口与不同的实现进行交互。
- 通常情况下, 客户端 (Client) 仅关心如何与抽象部分合作。 但是, 客户端需要将抽象对象与一个实现对象连接起来。
代码如下:
问题:开发一款股票市场检测程序,会从不同来源下载XML格式的股票数据,然后向用户呈现出分析图表。但是,分析函数库只兼容JSON格式的数据。
解决方案:将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的类可以一起工作。即创建一个适配器,能够转换对象接口。
#include <iostream>
#include <string>
//实现
class Device
{
public:
virtual ~Device()
{
}
virtual std::string turnOn()const = 0;
virtual std::string turnOff()const = 0;
virtual std::string turnOffMute()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 turnOffMute()const override
{
return "TV:静音...\n";
}
};
class Radio:public Device
{
public:
~Radio()
{
}
std::string turnOn() const override
{
return "TV:开机...\n";
}
std::string turnOff()const override
{
return "TV:关机...\n";
}
std::string turnOffMute()const override
{
return "TV:静音...\n";
}
};
//抽象
class BaseRemoteController
{
protected:
Device* device;
public:
~BaseRemoteController(){}
BaseRemoteController(Device* device):device(device){}
virtual std::string sendTurnOn()
{
return "基础遥控器发出TurnOn"+device->turnOn();
}
virtual std::string sendTurnOff() {
return "基础遥控器发出TurnOff" + device->turnOff();
}
virtual std::string sendTurnOffMute() {
return "基础遥控器发出TurnOffMute" + device->turnOffMute();
}
};
class AdvancedRemoteController :public BaseRemoteController
{
public:
AdvancedRemoteController(Device* device):BaseRemoteController(device){}
std::string sendTurnOn() override
{
return "高级遥控器发出TurnOn" + device->turnOn();
}
std::string sendTurnOff() override
{
return "高级遥控器发出TurnOff" + device->turnOff();
}
std::string sendTurnOffMute() override
{
return "高级遥控器发出TurnOffMute" + device->turnOffMute();
}
};
int main()
{
Radio radio;
BaseRemoteController remote(&radio);
std::cout << remote.sendTurnOn() << std::endl;
std::cout << remote.sendTurnOff() << std::endl;
std::cout << remote.sendTurnOffMute() << std::endl;
std::cout << "-------------------" << std::endl;
AdvancedRemoteController advancedRemote(&radio);
std::cout << advancedRemote.sendTurnOn() << std::endl;
std::cout << advancedRemote.sendTurnOffMute() << std::endl;
std::cout << advancedRemote.sendTurnOff() << std::endl;
return 0;
}