讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现桥接模式?(解耦抽象与实现)

千墨同学_5393

千墨同学_5393

发布时间:2026-02-18 18:13:48

|

472人浏览过

|

来源于php中文网

原创

桥接模式的核心是组合加虚函数,通过Abstraction持有Implementor指针并多态调用,而非继承;Implementor须为抽象基类,具体实现仅继承它;指针类型由生命周期归属决定,避免shared_ptr;接口需稳定,新增功能优先用默认实现。

c++如何实现桥接模式?(解耦抽象与实现)

桥接模式的核心不是继承,是组合加虚函数

桥接模式在 C++ 里最容易被写成“用继承模拟组合”——比如让 Abstraction 继承 Implementor,或者反过来。这完全违背桥接本意。它要解决的是抽象层(如 Shape)和实现层(如 Renderer)各自独立变化的问题,靠的是「持有指针 + 多态调用」,不是类层级的耦合。

关键判断:只要你在 Abstraction 里看到 public Implementor 或者 class Abstraction : public Implementor,就错了。

  • Abstraction 类里必须包含一个指向 Implementor 的指针(通常是 std::unique_ptr<implementor></implementor> 或裸指针,视生命周期而定)
  • Implementor 必须是抽象基类,定义纯虚函数(如 virtual void draw() = 0)
  • 所有具体实现(OpenGLRenderer、SkiaRenderer)只继承 Implementor,不碰 Abstraction 体系
  • 构造 Abstraction 子类时,必须传入一个具体的 Implementor 实例,不能在内部 new

std::unique_ptr 还是 raw pointer?看谁管生命周期

桥接对象的生命周期归属决定指针类型——这不是风格选择,是责任划分问题。常见错误是 Abstraction 拿着裸指针却擅自 delete,或用 std::shared_ptr 引入不必要的循环引用。

  • 如果 Abstraction 完全拥有 Implementor(比如用户传进来一个临时对象,你希望它活到 Abstraction 销毁),用 std::unique_ptr<implementor></implementor>
  • 如果 Implementor 是全局单例或由外部长期管理(如 GUI 框架提供的 Canvas),用裸指针 + 注释说明“non-owning”,且禁止在析构中 delete
  • 避免 std::shared_ptr:桥接不涉及共享所有权,加 refcount 只会模糊职责,还可能因循环引用导致泄漏

示例:Circle 构造时接收 std::unique_ptr<renderer>&&</renderer>,移动语义保证所有权清晰;而 UIWidget 接收 Renderer* 并标注 // owned by AppContext。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“C++免费学习笔记(深入)”;

虚函数表开销小,但别在 hot path 上间接调用

桥接必然引入一次虚函数调用(renderer->draw()),在图形渲染等高频路径上,这比直接内联调用多 1–2 个周期。不是性能瓶颈,但容易被忽略。

  • 不要在每像素循环里调用 implementor->put_pixel();应把整块数据交给 Implementor 批处理(如 render_buffer(const uint8_t*, size_t))
  • 如果某类 Implementor 确实需要极致性能(如 SIMD 渲染),可提供非虚的模板接口(template<typename t> void fast_draw(T&&)</typename>),但桥接主干仍走虚函数,保持扩展性
  • 编译器通常能对单实现场景做 devirtualization,但别依赖——确保关键路径不卡在虚调用上

容易漏掉的:Implementor 接口变更会破坏所有子类

桥接解耦的是类结构,不是接口契约。Implementor 基类一旦增加新纯虚函数,所有派生类都得改,否则链接失败。这点比继承更隐蔽,因为改动发生在“底层”。

  • 把 Implementor 接口设计得足够稳定:优先用组合已有接口(如 Drawable + Resizable),而不是堆大而全的基类
  • 新增能力尽量用默认实现(C++11 起支持 virtual void save_to_file() { throw std::runtime_error("not implemented"); }),而非强制重写
  • 测试时别只测 Abstraction 行为,要 mock 不同 Implementor 的行为差异,尤其验证异常路径下 Abstraction 是否正确转发错误

真正麻烦的从来不是写对桥接结构,而是当 Renderer 需要支持 Vulkan 后端时,你发现 OpenGLRenderer 和 SkiaRenderer 都得补 3 个新虚函数——这时候才意识到,接口粒度早该按能力切分,而不是按技术栈。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2398

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

371

2025.11.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3228

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5309

2025.10.17

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn