栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 桥接模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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> 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;
}
如何理解桥接模式?

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

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

劣势:

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号