桥接模式是什么?
桥接属于构型设计模式,目的是将业务逻辑拆分成不同的层次, 从而可以每一层进行独立开发
。可以概括成就将抽象接口部分与实现逻辑部分分离,从而最终解耦,便于后续扩展。
情景再现
我们平日开发应用为例
- 当前有多个操作系统Windows10、Windows7、Windows8、Windows xp
- 假设我们要同时开发两个应用,一个是直播App,另一个是聊天App
- 那最终需要4(操作系统)*2(App)=8个可执行程序
- 但对于App开发者来说关心平台是没有价值的,对于系统开发者来说也不能关心到具体运行了哪些应用,那如何把每个系统运行的应用程序输出呢?
代码还原
从软件接口的维度上看,所有软件的运行都需要像main函数这样的入口,我们这时可以把启动App抽象成一个接口,对于软件开发者来说最终告知启动哪个软件即可
class I_SoftWare {
public:
virtual ~I_SoftWare(){};
virtual void RunApp() = 0;
};
class StreamLiveApp : public I_SoftWare {
public:
void RunApp() {
std::cout << " Start Live APP " << std::endl;
}
};
class IMChatApp : public I_SoftWare {
public:
void RunApp() {
std::cout << " Start Chat APP " << std::endl;
}
};
class GameApp : public I_SoftWare {
public:
void RunApp() { std::cout << " Start Game APP " << std::endl; }
};
对于系统开发,无需关心当前具体是什么应用,通过应用启动的接口,就可以告知用户当前系统正在运行的App有哪些
//Windows
class I_OperatingSystem {
protected:
std::list<std::shared_ptr<I_SoftWare>> soft_list_;
public:
virtual ~I_OperatingSystem(){};
virtual void InstallApp(std::shared_ptr<I_SoftWare> ptrSoft) {
soft_list_.push_back(ptrSoft);
}
virtual void StartApp() = 0;
};
//Win10
class Windows10_OS : public I_OperatingSystem {
public:
void StartApp()
{
std::cout << "Windows 10 run App:"<<std::endl;
for (auto& ptr : soft_list_) {
ptr->RunApp();
}
}
};
//win7
class Windows7_OS : public I_OperatingSystem {
public:
void StartApp()
{
std::cout << "Windows 7 run App:" << std::endl;
for (auto& ptr : soft_list_) {
std::cout << "run App with Animation:";
ptr->RunApp();
}
}
};
但用户的视角:不需关心具体是什么版本的操作系统,我想知道当前系统运行了哪些软件,那就调用系统的StartApp功能即可。
所以最终无论哪种操作系统,无论什么软件,都最终抽象成了
- I_SoftWare的启动此App和I_OperatingSystem运行App
而对于不同版本的系统和不同的应用,只需要各自的开发实现最终的方法即可
#include <iostream>
#include <memory>
#include <list>
void SystemRunApp(std::shared_ptr<I_OperatingSystem> os) {
std::shared_ptr<I_SoftWare> live_app = std::make_shared<StreamLiveApp>();
std::shared_ptr<I_SoftWare> chat_app = std::make_shared<IMChatApp>();
os->InstallApp(live_app);
os->InstallApp(chat_app);
os->StartApp();
}
int main()
{
//win10
std::shared_ptr<I_OperatingSystem> system1 = std::make_shared<Windows10_OS>();
SystemRunApp(system1);
std::cout << "================================" << std::endl;
//win7
std::shared_ptr<I_OperatingSystem> system2 = std::make_shared<Windows7_OS>();
SystemRunApp(system2);
std::cout << "================================" << std::endl;
system1->InstallApp(std::make_shared<GameApp>());
system1->StartApp();
system("pause");
return 0;
}
如何理解桥接模式?
对于用户来说,始终是单一的入口,但对于一个事物类可以从两个或更多的维度进行变化,我们可以通过组合的方式,进行横向扩展,避免了继承的形式造成的指数级增加
优势:
- 接口和实现最终解耦;
- 扩展性提高,如果增加新的变量,不会修改原有代码,保证了开闭原则;
- 每个可变事物都至于自己有关,与其他人无关,实现了单一职责原则;
劣势:
- 高内聚的类使用该模式可能会让代码变的臃肿可读性差
桥接模式与适配器的比较
桥接模式:将抽象接口与它的实现进行分离,桥接模式一般用于程序设计的前期;
适配器模式:把"正方形"接口变换"三角形"接口,始两个不相干的类,最终可以在同一方法下调用,这个用于程序后期的迭代适配;