使用场景
小明想要设计一个功能,将不同形状的的图形,以不同渲染方式绘制到屏幕上。
也就是将图形转换到渲染后的图形,此时,便可以利用桥接模式进行转换。
代码实现
#include<iostream>
#include<vector>
using namespace std;
struct Renderer {
virtual void render_circle(float x, float y, float radius) = 0;
};
struct VectorRenderer :Renderer {
void render_circle(float x, float y, float radius) override //模拟不同的渲染
{
cout << " VectorRenderer" << radius<<endl;
}
};
struct RasterRenderer :Renderer {
void render_circle(float x, float y, float radius) override //模拟不同的渲染
{
cout << " RasterRenderer" << radius << endl;
}
};
struct Shape {
protected:
Renderer& renderer; //保存了一个渲染器的引用
Shape(Renderer& renderer) :renderer{renderer}{}
public:
virtual void draw() = 0;
virtual void resize(float factor) = 0;
};
struct Circle :Shape {
float x, y, radius;
Circle(Renderer& renderer, float x, float y, float radius) :Shape{ renderer }, x{ x }, y{ y }, radius{radius}{}
void draw() override{
renderer.render_circle(x,y,radius);
}
void resize(float factor) override{
radius *= factor;
}
};
int main() {
RasterRenderer rr; //桥接器
Circle raster_circle{ rr,5,5,5 };
raster_circle.draw();
raster_circle.resize(2);
raster_circle.draw();
return 0;
}
其中RasterRenderer便是连接转换的桥接器,可以观察到桥接器与对象是聚合的关系。
总结
通过上例可以观察到,桥接模式作为连接器,可以将两种对象进行连接,在逻辑隐藏的情况下实现交互,参与者之间是知道彼此的。