描述
桥接模式是一种结构型设计模式,其目的是将抽象部分和实现部分分离开来,使得它们可以独立地变化。
在桥接模式中,将抽象部分定义为一个接口(也可以是抽象类),实现部分也定义为一个接口,并且在抽象部分中包含一个实现部分的引用。这样,抽象部分和实现部分就可以分别变化,而不会相互影响。
桥接模式可以用来处理多层继承结构,将类的功能层次结构与类的实现层次结构分离出来,从而使它们可以独立地扩展。
示例
下面是一个 c++ 桥接模式的示例,其中包含了一个抽象部分和两个实现部分:
class DrawingAPI {
public:
virtual ~DrawingAPI() {};
virtual void drawCircle(double x, double y, double radius) = 0;
};
class DrawingAPI1 : public DrawingAPI {
public:
void drawCircle(double x, double y, double radius) override {
std::cout << "API1.circle at (" << x << ':' << y << ')'
<< " radius " << radius << std::endl;
}
};
class DrawingAPI2 : public DrawingAPI {
public:
void drawCircle(double x, double y, double radius) override {
std::cout << "API2.circle at (" << x << ':' << y << ')'
<< " radius " << radius << std::endl;
}
};
class Shape {
public:
virtual ~Shape() {};
virtual void draw() = 0;
virtual void resizeByPercentage(double pct) = 0;
};
class CircleShape : public Shape {
public:
CircleShape(double x, double y, double radius, DrawingAPI* drawingAPI)
:m_x(x), m_y(y), m_radius(radius), m_drawingAPI(drawingAPI) {}
void draw() override {
m_drawingAPI->drawCircle(m_x, m_y, m_radius);
}
void resizeByPercentage(double pct) override {
m_radius *= pct;
}
private:
double m_x, m_y, m_radius;
DrawingAPI* m_drawingAPI;
};
在这个示例中,DrawingAPI
是定义实现部分的接口。DrawingAPI1
和 DrawingAPI2
是两个具体的实现类。Shape
是定义抽象部分的接口,并包含了一个 DrawingAPI
的指针成员变量 m_drawingAPI
。CircleShape
是一个实现了 Shape
接口的具体类,其构造函数中包含了 m_drawingAPI
的初始化。
可以通过以下方式使用这个桥接模式的示例:
int main() {
DrawingAPI1 drawingAPI1;
DrawingAPI2 drawingAPI2;
CircleShape circle1(1, 2, 3, &drawingAPI1);
CircleShape circle2(5, 7, 11, &drawingAPI2);
circle1.resizeByPercentage(2.5);
circle2.resizeByPercentage(2.5);
circle1.draw();
circle2.draw();
return 0;
}
在主函数中,定义了两个具体的实现类 DrawingAPI1
和 DrawingAPI2
,然后分别传递给两个具体的 CircleShape
对象。在对两个 CircleShape
对象进行一定的操作(调用 resizeByPercentage
函数),然后分别调用它们的 draw
函数,输出结果。
输出结果为:
API1.circle at (1:2) radius 7.5
API2.circle at (5:7) radius 27.5
从输出结果可以看出,CircleShape
的 draw
函数成功地将抽象部分和实现部分分离开来,并且可以独立地变化。