桥接模式通过分离抽象与实现,使二者独立变化。1. 定义Renderer基类声明渲染接口;2. OpenGLRenderer等子类实现具体渲染逻辑,提升系统可扩展性与可维护性。
桥接模式的核心是把抽象部分和它的实现部分分离,使它们可以独立变化。在C++中,这通常通过将“实现”抽取为独立的接口类,并在抽象类中持有该接口的指针来实现。这样,修改实现或扩展新的抽象都不需要重新编译对方,提升了系统的可扩展性和可维护性。
先定义一个实现类的基类,它提供实现层面的接口。这个类通常是一个纯虚类,由具体的实现类继承并完成具体逻辑。
class Renderer {
public:
virtual ~Renderer() = default;
virtual void renderCircle(float x, float y, float radius) = 0;
virtual void renderRectangle(float x, float y, float width, float height) = 0;
};
实现类继承自Renderer,分别对应不同的渲染方式,比如OpenGL或DirectX。
class OpenGLRenderer : public Renderer {
public:
void renderCircle(float x, float y, float radius) override {
// 模拟OpenGL绘制圆
std::cout << "OpenGL: Drawing cir
cle at (" << x << ", " << y << ") with radius " << radius << "\n";
}
void renderRectangle(float x, float y, float width, float height) override {
std::cout << "OpenGL: Drawing rectangle at (" << x << ", " << y << ") size " << width << "x" << height << "\n";
}};
class DirectXRenderer : public Renderer {
public:
void renderCircle(float x, float y, float radius) override {
std::cout
void renderRectangle(float x, float y, float width, float height) override {
std::cout << "DirectX: Drawing rectangle at (" << x << ", " << y << ") size " << width << "x" << height << "\n";
}
};
抽象类包含一个指向Renderer的指针,所有图形操作都委托给该实现对象。它本身也可以被继承扩展。
class Shape {
protected:
Renderer* renderer;
public:
Shape(Renderer* r) : renderer(r) {}
virtual ~Shape() = default;
virtual void draw() = 0;
virtual void resize(float factor) = 0;
};
具体形状类如Circle和Rectangle继承自Shape,使用持有的renderer完成实际绘制。
class Circle : public Shape {
private:
float x, y, radius;
public:
Circle(Renderer* r, float x, float y, float radius)
: Shape(r), x(x), y(y), radius(radius) {}
void draw() override {
renderer->renderCircle(x, y, radius);
}
void resize(float factor) override {
radius *= factor;
}};
class Rectangle : public Shape {
private:
float x, y, width, height;
public:
Rectangle(Renderer* r, float x, float y, float width, float height)
: Shape(r), x(x), y(y), width(width), height(height) {}
void draw() override {
renderer->renderRectangle(x, y, width, height);
}
void resize(float factor) override {
width *= factor;
height *= factor;
}};
客户端代码可以根据需要组合不同的形状和渲染器,无需修改原有类。
int main() {
OpenGLRenderer opengl;
DirectXRenderer directx;
Circle circle(&opengl, 10, 10, 5);
Rectangle rect(&directx, 0, 0, 4, 6);
circle.draw(); // 输出:OpenGL: Drawing circle...
rect.draw(); // 输出:DirectX: Drawing rectangle...
circle.resize(2);
circle.draw(); // 半径变为10后再次绘制
return 0;
}
桥接模式的关键在于解耦。你可以在不改动图形类的前提下添加新的渲染方式,也可以在不影响渲染器的情况下增加新的图形类型。这种结构特别适合多维度变化的系统设计。
基本上就这些。
# c++
# Float
# 子类
# void
# 指针
# 继承
# 接口
# class
# public
# private
# 委托
# 对象
# 桥接
# 抽象类
# 多维
# 是一个
# 都不
# 你可以
# 渲染器
# 并在
# 可以根据
相关文章:
宁波免费建站如何选择可靠模板与平台?
如何在IIS管理器中快速创建并配置网站?
如何在宝塔面板中创建新站点?
如何选择高效稳定的ISP建站解决方案?
如何在腾讯云服务器上快速搭建个人网站?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何在阿里云购买域名并搭建网站?
建站之星免费版是否永久可用?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
如何用西部建站助手快速创建专业网站?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
济南企业网站制作公司,济南社保单位网上缴费步骤?
网页设计网站制作软件,microsoft office哪个可以创建网页?
网站制作网站,深圳做网站哪家比较好?
黑客如何通过漏洞一步步攻陷网站服务器?
定制建站流程步骤详解:一站式方案设计与开发指南
宁波自助建站系统如何快速打造专业企业网站?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
如何在腾讯云免费申请建站?
已有域名能否直接搭建网站?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Python如何创建带属性的XML节点
建站主机SSH密钥生成步骤及常见问题解答?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
建站之星安装步骤有哪些常见问题?
如何选择网络建站服务器?高效建站必看指南
如何在云主机上快速搭建多站点网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
如何正确选择百度移动适配建站域名?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
Swift中循环语句中的转移语句 break 和 continue
佛山网站制作系统,佛山企业变更地址网上办理步骤?
简历在线制作网站免费版,如何创建个人简历?
如何在云指建站中生成FTP站点?
为什么Go需要go mod文件_Go go mod文件作用说明
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
制作销售网站教学视频,销售网站有哪些?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何用狗爹虚拟主机快速搭建网站?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
网站制作新手教程,新手建设一个网站需要注意些什么?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何基于PHP生成高效IDC网络公司建站源码?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
如何快速生成橙子建站落地页链接?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何选择域名并搭建高效网站?
如何在IIS7中新建站点?详细步骤解析
*请认真填写需求信息,我们会在24小时内与您取得联系。