C++ 桥接模式

桥接模式是一种设计模式,旨在将业务逻辑分层,允许独立开发抽象接口和实现。通过实例,展示了如何在操作系统和应用程序之间使用桥接模式,以减少应用程序与操作系统的耦合,提高扩展性。用户只需关注单一入口,而系统开发者无需关心具体应用。桥接模式与适配器模式的区别在于,前者分离接口和实现,后者用于适配不同接口。
摘要由CSDN通过智能技术生成

桥接模式是什么?

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

情景再现

我们平日开发应用为例

  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
    评论
C++桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过将继承关系转化为关联关系,从而实现了解耦。 下面是一个具体的C++桥接模式实例: 假设我们有一个图形类 Shape,它有两个子类:Circle(圆)和Square(正方形)。我们还有一个颜色类 Color,它有两个子类:Red(红色)和Blue(蓝色)。我们希望能够在不修改图形类和颜色类的情况下,动态地组合它们。 首先,我们定义一个抽象类 Shape,其中包含一个指向颜色类的指针: ```cpp class Shape { protected: Color* color; public: virtual void draw() = 0; void setColor(Color* c) { color = c; } }; ``` 然后,我们定义两个具体的图形类 Circle 和 Square,它们都继承自 Shape 类,并实现 draw() 方法: ```cpp class Circle : public Shape { public: void draw() { cout << "Drawing a circle "; color->fill(); } }; class Square : public Shape { public: void draw() { cout << "Drawing a square "; color->fill(); } }; ``` 接下来,我们定义一个抽象类 Color,其中包含一个 fill() 方法: ```cpp class Color { public: virtual void fill() = 0; }; ``` 然后,我们定义两个具体的颜色类 Red 和 Blue,它们都继承自 Color 类,并实现 fill() 方法: ```cpp class Red : public Color { public: void fill() { cout << "with red color." << endl; } }; class Blue : public Color { public: void fill() { cout << "with blue color." << endl; } }; ``` 最后,我们可以使用桥接模式来动态地组合图形和颜色: ```cpp int main() { Shape* shape = new Circle(); Color* color = new Red(); shape->setColor(color); shape->draw(); delete shape; delete color; return 0; } ``` 运行上述代码,输出结果为: ``` Drawing a circle with red color. ``` 这个例子中,我们可以通过设置不同的颜色对象来改变图形的填充颜色,而不需要修改图形类的代码。这就是桥接模式的优势所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值