版权声明:本文为博主原创文章,未经同意不允许转载! 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.适用于多维度的变化。