C++设计模式-桥接模式详解

版权声明:本文为博主原创文章,未经同意不允许转载! https://blog.csdn.net/wb175208/article/details/85254997

桥接模式:将抽象和实现解耦,使得两者可以独立的变化。如果同时变化的有两个维度,桥接模式可以很好的适应。

还是根据之前的绘制接口,实现不同形状的图形的绘制,看看如何实现:
首先定义一个基本的绘制接口:

//图形绘制接口
class IGraph {
public:
	IGraph();
	~IGraph();

	virtual void draw() = 0;
};
IGraph::IGraph() {
}

IGraph::~IGraph() {
}

在这个基类的基础之上实现不同的绘制功能。

绘制矩形:

class Rect :public IGraph {
public: 
	void draw()override;
};

void Rect::draw() {
	printf("绘制一个矩形!\n");
}

绘制圆形:

class Circle :public IGraph {
public:
	void draw()override;
};
void Circle::draw() {
	printf("绘制一个圆形!\n");
}

看看客户端的调用:

int main() {
	IGraph* rect = new Rect;
	rect->draw();

	IGraph* circle = new Circle;
	circle->draw();

	return 0;
}

运行一下:
在这里插入图片描述

很简单,就实现了。

但是现在需求功能扩展了,比如要给绘制的图形添加上颜色,红色的矩形或者蓝色的圆形等。
同样的道理,还是继承基本基类。

class RedRect :public IGraph {
public:
	void draw()override;
};
void RedRect::draw() {
	printf("绘制一个红色的矩形!\n");
}

现在完成了一个红色矩形的绘制,如果要绘制一个蓝色的矩形呢?还有黄色的矩形?是不是都要继承下来,如果图形有很多并且颜色也有很多呢,是不是要把所有的情况都要继承下来,重写一遍,那岂不是麻烦死了?有没有更好的办法呢?

有的。

首先把颜色基类提取出来:

class IColor {
public:
	virtual void drawColor() = 0;
};

定义红色绘制:

class RedColor :public IColor {
public:
	void drawColor()override;
};
void RedColor::drawColor() {
	printf("颜色:红色\n");
}

绘制蓝色:

class BlueColor :public IColor {
public:
	void drawColor()override;
};
void BlueColor::drawColor() {
	printf("颜色:蓝色\n");
}

修改一下绘制图形接口:

//图形绘制接口
class IGraph {
public:
	IGraph();
	~IGraph();

	virtual void draw(IColor* color) = 0;
};

绘制图形:

class Rect :public IGraph {
public: 
	void draw(IColor* color)override;
};

class Circle :public IGraph {
public:
	void draw(IColor* color)override;
};

void Rect::draw(IColor* color) {
	printf("绘制一个矩形!  ");
	color->drawColor();
}

void Circle::draw(IColor* color) {
	printf("绘制一个圆形!  ");
	color->drawColor();
}

修改一下客户端调用:

int main() {
	IGraph* rect = new Rect;
	IColor* red = new RedColor;
	rect->draw(red);

	IGraph* circle = new Circle;
	IColor* blue = new BlueColor;
	circle->draw(blue);

	return 0;
}

运行一下:
在这里插入图片描述

这样通过扩展可以快速的实现多种颜色不同图形的绘制。

以上实现的就是采用桥接模式实现的。

桥接模式的优点:
1.抽象和实现的分离;
2.只要提供相应的接口,扩展功能就不适合问题;
3.适用于多维度的变化。

猜你喜欢

转载自blog.csdn.net/wb175208/article/details/85254997
今日推荐