C++ 设计模式之桥接模式

C++ 设计模式之桥接模式

简介

1、桥接模式(Bridge)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过组合的方式建立两个类系(抽象部分和实现部分)之间的联系,而不是继承。

2、桥接模式 (Bridge)应用场景包括但不限于:

2.1、当想要避免一个类受多个维度的变化所影响时。

2.2、当类的实现可能独立于其抽象层面变化时,且实现也应易于切换或重新配置。

2.3、当你想要分享多个对象的实现,但同时需要避免使用引用计数之类的指针的额外开销时。

3、桥接模式 (Bridge)的构成

3.1、抽象化(Abstraction)角色:定义抽象类的接口,并保存一个对实现化对象的引用。

c 复制代码
class Renderer
{
public:
	virtual void renderCircle(float radius) = 0;
	virtual ~Renderer() {}
};

3.2、扩展抽象化(RefinedAbstraction)角色:实现抽象化角色中的接口,并通过组合关系调用实现化角色中的操作。

c 复制代码
class VectorRenderer : public Renderer
{
public:
	void renderCircle(float radius);
};

3.3、实现化(Implementor)角色:定义实现化角色的接口,但不提供具体的实现。该接口不一定与抽象化角色的接口完全一致,事实上,这两个接口可以完全不同。一般而言,实现化角色接口中的方法比抽象化角色接口中的方法要少。

c 复制代码
class Shape
{
public:
	Shape(Renderer& renderer);
	virtual void draw() = 0;
	virtual void resize(float factor) = 0;
	virtual ~Shape() {}

protected:
	Renderer& renderer;
};

3.4、具体实现化(ConcreteImplementor)角色:实现实现化角色接口,给出具体的实现。

c 复制代码
class Circle : public Shape
{
public:
	Circle(Renderer& renderer, float radius);
	void draw();
	void resize(float factor);

private:
	float radius;
};

4、桥接模式 (Bridge)的优点

4.1、可扩展性: 可以独立地扩展抽象化角色和实现化角色,而不会影响到对方。

4.2、弹性和可维护性: 桥接模式将实现细节推迟到可以独立变化的层面上,有助于提高代码的可维护性。

4.3、分离抽象与实现: 可以实现抽象和实现的分离,在不改变抽象界面的前提下,有助于改变实现细节。

4.4、为复杂类的强耦合问题提供解决方案: 特别适合于那些可能需要多种变化维度的场景,如不同的平台、操作系统等。

5、桥接模式 (Bridge)的缺点

5.1、增加了系统的复杂性: 引入的抽象化和实现化角色可能会增加系统的复杂性。

5.2、设计和理解上的难度: 对于初学者来说,桥接模式的理解和设计都较为复杂。

简单示例

1、定义

c 复制代码
class Renderer
{
public:
	virtual void renderCircle(float radius) = 0;
	virtual ~Renderer() {}
};

class VectorRenderer : public Renderer
{
public:
	void renderCircle(float radius);
};

class RasterRenderer :public Renderer
{
public:
	void renderCircle(float radius);
};

class Shape
{
public:
	Shape(Renderer& renderer);
	virtual void draw() = 0;
	virtual void resize(float factor) = 0;
	virtual ~Shape() {}

protected:
	Renderer& renderer;
};

class Circle : public Shape
{
public:
	Circle(Renderer& renderer, float radius);
	void draw();
	void resize(float factor);

private:
	float radius;
};

2、实现

c 复制代码
void VectorRenderer::renderCircle(float radius)
{
	std::cout << "Vector circle of radius " << radius << std::endl;
}

void RasterRenderer::renderCircle(float radius)
{
	std::cout << "Raster circle of radius " << radius << std::endl;
}

Shape::Shape(Renderer& rendererrer) : renderer(rendererrer)
{

}

Circle::Circle(Renderer& renderer, float radius) : Shape(renderer), radius(radius)
{

}

void Circle::draw()
{
	renderer.renderCircle(radius);
}

void Circle::resize(float factor)
{
	radius *= factor;
}

3、调用

c 复制代码
RasterRenderer raster;
Circle rasterCircle(raster, 5);
rasterCircle.draw();
rasterCircle.resize(2);
rasterCircle.draw();

VectorRenderer vecRen;
Circle vecCircle(vecRen, 4);
vecCircle.draw();
vecCircle.resize(2);
vecCircle.draw();
相关推荐
qq_4069810311 小时前
什么是顶层 const什么是底层const
开发语言·c++
zwc321043205511 小时前
第四周第五天——重构成类
c++·人工智能·opencv·算法·计算机视觉
凉茶钱11 小时前
多态:从虚函数语法到虚表寻址,一次讲透动态绑定
开发语言·c++·多态
01二进制代码漫游日记12 小时前
[C++]之内存管理(一)
jvm·c++·学习
codebolt12 小时前
C++程序crash分析和内存检测
开发语言·c++
ShineWinsu12 小时前
对于Qt:QLabel常见属性的解析
c++·qt·面试·笔试·gui·标签·qlabel
zwc321043205513 小时前
Day 5:threshold与inRange阈值分割
c++·图像处理·人工智能·opencv·算法·计算机视觉
小徐不徐说13 小时前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso13 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
Sakura_j_h_1 天前
EasyEDA PCB 快速设计Skills
c++·python·github