C++ 桥接模式

桥接模式是什么?

桥接属于构型设计模式,目的是将业务逻辑拆分成不同的层次, 从而可以每一层进行独立开发
。可以概括成就将抽象接口部分与实现逻辑部分分离,从而最终解耦,便于后续扩展。

情景再现

我们平日开发应用为例

  1. 当前有多个操作系统Windows10、Windows7、Windows8、Windows xp
  2. 假设我们要同时开发两个应用,一个是直播App,另一个是聊天App
  3. 那最终需要4(操作系统)*2(App)=8个可执行程序
  4. 但对于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;
}
如何理解桥接模式?

对于用户来说,始终是单一的入口,但对于一个事物类可以从两个或更多的维度进行变化,我们可以通过组合的方式,进行横向扩展,避免了继承的形式造成的指数级增加
优势:

  • 接口和实现最终解耦;
  • 扩展性提高,如果增加新的变量,不会修改原有代码,保证了开闭原则;
  • 每个可变事物都至于自己有关,与其他人无关,实现了单一职责原则;

劣势:

  • 高内聚的类使用该模式可能会让代码变的臃肿可读性差
桥接模式与适配器的比较

桥接模式:将抽象接口与它的实现进行分离,桥接模式一般用于程序设计的前期;

适配器模式:把"正方形"接口变换"三角形"接口,始两个不相干的类,最终可以在同一方法下调用,这个用于程序后期的迭代适配;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值