桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立的变化。属于结构型模式。通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
适用场景
1、你不希望在抽象和它的实现部分之间有一个固定的绑定关系。 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
2、类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时 Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
3、对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
4、(C++)你想对客户完全隐藏抽象的实现部分。在 C++中,类的表示在类接口中是可见的。
5、 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
using namespace std;
//创建桥接实现接口drawapi。
class drawapi
{
public:
drawapi() {};
virtual ~drawapi() {};
virtual void drawcircle(int radius,int x,int y)=0;
};
//创建实现了DrawAPI接口的实体桥接实现类redcircle。
class redcircle:drawapi
{
public:
redcircle() {};
virtual ~redcircle() {};
void drawcircle(int radius, int x, int y) { cout << "color: red " << "sadius: " << radius << " x: " << x << " y: " << y << endl; };
};
//创建实现了DrawAPI接口的实体桥接实现类greencircle。
class greencircle :drawapi
{
public:
greencircle() {};
virtual ~greencircle() {};
void drawcircle(int radius, int x, int y) { cout << "color: green " << "sadius: " << radius << " x: " << x << " y: " << y << endl; };
};
//使用DrawAPI接口创建抽象类Shape。
class shape
{
public:
shape() {};
virtual ~shape() { delete mdrawapi; mdrawapi = NULL; };
virtual void draw()=0;
protected:
drawapi *mdrawapi;
};
//创建实现了Shape接口的实体类circle。
class circle :shape
{
public:
circle(int tx, int ty, int tradius, drawapi *tdrawapi) { mdrawapi = tdrawapi; x = tx; y = ty; radius = tradius; };
~circle() {};
void draw() { mdrawapi->drawcircle(radius,x,y); };
private:
int x;
int y;
int radius;
};
int main()
{
shape *t1 = (shape*)new circle(100, 100, 10, (drawapi*)new redcircle());
shape *t2 = (shape*)new circle(35, 74, 10, (drawapi*)new greencircle());
t1->draw();
t2->draw();
delete t1;
t1 = NULL;
delete t2;
t2 = NULL;
return 0;
}
在visual studio 2015上运行结果: