桥接属于构型设计模式,目的是将业务逻辑拆分成不同的层次, 从而可以每一层进行独立开发
。可以概括成就将抽象接口部分与实现逻辑部分分离,从而最终解耦,便于后续扩展。
我们平日开发应用为例
- 当前有多个操作系统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> soft_list_;
public:
virtual ~I_OperatingSystem(){};
virtual void InstallApp(std::shared_ptr 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:"<
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如何理解桥接模式?#include #include void SystemRunApp(std::shared_ptr
os) { std::shared_ptr live_app = std::make_shared (); std::shared_ptr chat_app = std::make_shared (); os->InstallApp(live_app); os->InstallApp(chat_app); os->StartApp(); } int main() { //win10 std::shared_ptr system1 = std::make_shared (); SystemRunApp(system1); std::cout << "================================" << std::endl; //win7 std::shared_ptr system2 = std::make_shared (); SystemRunApp(system2); std::cout << "================================" << std::endl; system1->InstallApp(std::make_shared ()); system1->StartApp(); system("pause"); return 0; }
对于用户来说,始终是单一的入口,但对于一个事物类可以从两个或更多的维度进行变化,我们可以通过组合的方式,进行横向扩展,避免了继承的形式造成的指数级增加
优势:
- 接口和实现最终解耦;
- 扩展性提高,如果增加新的变量,不会修改原有代码,保证了开闭原则;
- 每个可变事物都至于自己有关,与其他人无关,实现了单一职责原则;
劣势:
- 高内聚的类使用该模式可能会让代码变的臃肿可读性差
桥接模式:将抽象接口与它的实现进行分离,桥接模式一般用于程序设计的前期;
适配器模式:把"正方形"接口变换"三角形"接口,始两个不相干的类,最终可以在同一方法下调用,这个用于程序后期的迭代适配;



