新闻中心

C++如何实现一个桥接模式_C++设计模式之将抽象与实现分离

2025-12-09
浏览次数:
返回列表
桥接模式通过分离抽象与实现,使二者独立变化。1. 定义Renderer基类声明渲染接口;2. OpenGLRenderer等子类实现具体渲染逻辑,提升系统可扩展性与可维护性。

c++如何实现一个桥接模式_c++设计模式之将抽象与实现分离

桥接模式的核心是把抽象部分和它的实现部分分离,使它们可以独立变化。在C++中,这通常通过将“实现”抽取为独立的接口类,并在抽象类中持有该接口的指针来实现。这样,修改实现或扩展新的抽象都不需要重新编译对方,提升了系统的可扩展性和可维护性。

1. 定义实现接口(Implementor)

先定义一个实现类的基类,它提供实现层面的接口。这个类通常是一个纯虚类,由具体的实现类继承并完成具体逻辑。

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;
};

2. 提供具体实现(Concrete Implementor)

实现类继承自Renderer,分别对应不同的渲染方式,比如OpenGL或DirectX。

class OpenGLRenderer : public Renderer {
public:
    void renderCircle(float x, float y, float radius) override {
        // 模拟OpenGL绘制圆
        std::cout << "OpenGL: Drawing circle at (" << x << ", " << y << ") with radius " << radius << "\n";
    }
<pre class="brush:php;toolbar:false;">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";
}

};

3. 定义抽象类(Abstraction)

抽象类包含一个指向Renderer的指针,所有图形操作都委托给该实现对象。它本身也可以被继承扩展。

class Shape {
protected:
    Renderer* renderer;
<p>public:
Shape(Renderer* r) : renderer(r) {}</p><pre class="brush:php;toolbar:false;">virtual ~Shape() = default;

virtual void draw() = 0;
virtual void resize(float factor) = 0;

};

4. 创建具体抽象类(Refined Abstraction)

具体形状类如CircleRectangle继承自Shape,使用持有的renderer完成实际绘制。

GemDesign GemDesign

AI高保真原型设计工具

GemDesign 652 查看详情 GemDesign
class Circle : public Shape {
private:
    float x, y, radius;
<p>public:
Circle(Renderer* r, float x, float y, float radius)
: Shape(r), x(x), y(y), radius(radius) {}</p><pre class="brush:php;toolbar:false;">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;
}

};

5. 使用桥接模式

客户端代码可以根据需要组合不同的形状和渲染器,无需修改原有类。

int main() {
    OpenGLRenderer opengl;
    DirectXRenderer directx;
<pre class="brush:php;toolbar:false;">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++如何实现一个桥接模式_C++设计模式之将抽象与实现分离的详细内容,更多请关注其它相关文章!


# 都不  # 山西网站推广案例最新  # 做seo销售如何找客户  # 海外网站推广公司有哪些  # 市场营销推广服务费  # seo地址  # 望牛墩网络营销推广公司  # 陕西专业关键词排名优化  # 黄石网站推广优化技巧  # seo服饰行业  # 金华网站界面优化  # c++  # 是一个  # 清空  # 多维  # 如何将  # 抽象类  # 转换为  # 子类  # 如何实现  # 桥接 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 微信客户端如何收红包_微信客户端接收红包使用教程  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  Angular Material 垂直步进器:实现底部到顶部排序的教程  在哪找SublimeJ远程工具_SFTP插件配置教程  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  VS Code远程开发时如何处理文件权限问题  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  小红书网页版入口链接分享 小红书官网直接进  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  AO3镜像入口大全 AO3网页版内容访问全集  抖音从哪里进入网页版_抖音官方入口链接  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  iCloud登录入口网页版 苹果iCloud官网登录  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  mc.js游戏直达 mc.js网页免下载版本秒进地址  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  Discord Slash 命令响应超时问题的异步解决方案  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  Pandas DataFrame:高效添加条件计算列  Log4j Console Appender性能瓶颈与高并发优化策略  AO3最新可访问网址 Archive of Our Own官方在线入口  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  在命令行怎么运行html项目_命令行运行html项目方法【教程】  快手赚钱渠道_快手收益来源  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  微博网页版首页入口 微博电脑端官网登录链接  poki网页游戏推荐_poki免费游戏平台入口  163邮箱官方主页登录 直达网易邮箱登录核心页面  自定义Bag-of-Words实现:处理带负号的词汇权重  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  12306选座如何查看座位示意图_12306座位示意图解读与使用  AO3同人作品网入口 AO3搜索引擎官网永久地址  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  深入理解Promise链:如何在catch后中断then的执行  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  如何更改在 Excel 中打开超链接时的默认浏览器 

搜索