c++如何实现桥接设计模式_c++解耦抽象与实现
技术百科
穿越時空
发布时间:2025-12-30
浏览: 次 桥接模式通过组合将抽象与实现分离,使其独立扩展。定义Abstraction(遥控器)持有Implementor(设备)指针,各自形成类层级:Device为实现基类,TV和Radio提供具体实现;Remote为抽象基类,BasicRemote和EnhancedRemote扩展高层行为。运行时动态绑定,如BasicRemote控制TV,EnhancedRemote控制Radio,新增设备或遥控器无需修改对方代码,符合开闭原则。
桥接模式用于将抽象部分与它的实现部分分离,使它们可以独立变化。在C++中,这通常通过类层次结构和指针或引用实现解耦。关键在于用组合代替继承,把可能变化的实现细节提取到另一个类体系中。
核心结构:抽象与实现分离
定义两个独立的类层级:一个是抽象(Abstraction),它包含一个指向实现(Implementor)的指针;另一个是实现基类及其具体实现。这样,修改实现不会影响抽象接口。
- Abstraction 类持有 Implementor 接口的指针,调用其方法
- Implementor 是实现接口,定义底层操作
- ConcreteImplementor 提供具体实现
- RefinedAbstraction 可扩展高层行为而不影响实现
代码示例:设备控制与远程操作
假设我们有不同设备(电视、收音机)和不同类型的遥控器(基础、静音)。设备类型和遥控方式应能独立扩展。
#include// 实现接口:设备 class Device { public: virtual void turnOn() = 0; virtual void turnOff() = 0; virtual ~Device() = default; };
// 具体实现:电视 class TV : public Device { public: void turnOn() override { std::cout << "TV is turning on\n"; } void turnOff() override { std::cout << "TV is turning off\n"; } };
// 具体实现:收音机 class Radio : public Device { public: void turnOn() override { std::cout << "Radio is turning on\n"; } void turnOff() override { std::cout << "Radio is turning off\n"; } };
// 抽象:遥控器 class Remote { protected: Device device; public: explicit Remote(Device d) : device(d) {} virtual void power() = 0; virtual ~Remote() = default; };
// 具体抽象:基础遥控 class BasicRemote : public Remote { public: using Remote::Remote; void power() override { device->turnOn(); } };
// 扩展抽象:带关机功能的遥控 class EnhancedRemote : public Remote { public: using Remote::Remote; void power() override { if (/ some condition / true) { device->turnOn(); } else { device->turnOff(); } } void mute() { std::cout << "Muting device...\n"; } };
使用方式:运行时绑定
可以在程序运行时动态组合不同的抽象和实现,无需重新编译。
int main() {
TV tv;
Radio radio;
BasicRemote basicTv(&tv);
EnhancedRemote enhancedRadio(&radio);
basicTv.power(); // 输出: TV is turning on
enhancedRadio.power(); // 输出: Radio is turning on
enhancedRadio.mute(); // 输出: Muting device...
return 0;
}
通过这种方式,新增设备只需继承 Device,新增遥控器类型只需扩展 Remote。两者互不影响,符合开闭原则。基本上就这些,不复杂但容易忽略设计初衷。
# ai
# 而不
# 只需
# 绑定
# 关键在于
# 使其
# 不同类型
# c++
# 指针
# stream
# 接口
# 继承
# asic
# ios
# 使它
# 或引用
# 桥接
# 开闭
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- windows 10应用商店区域怎么改_windo
- TestNG的testng.xml配置文件怎么写
- c# 服务器GC和工作站GC的区别和设置
- Windows10系统怎么查看硬盘健康_Win10
- 如何使用Golang实现多重错误处理_Golang
- 如何使用Golang安装API文档生成工具_快速生
- Windows10如何更改桌面图标间距_Win10
- Mac如何与安卓手机传文件_Mac和Android
- MAC如何安装Git版本控制工具_MAC开发环境配
- Win10如何卸载WindowsDefender_
- Windows10电脑怎么设置虚拟光驱_Win10
- 如何优化Golang内存分配与GC调度_Golan
- Win11右键反应慢怎么办 Win11优化右键菜单
- Python生成器表达式内存优化_惰性计算说明【指
- Mac如何使用听写功能_Mac语音输入打字【效率技
- Win10如何卸载Skype_Win10卸载Sky
- Win11怎么开启剪贴板历史记录_Windows1
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Golang如何测试HTTP中间件_Golang
- 如何自定义Windows终端的默认配置文件?(Po
- 如何在Windows中创建新的用户账户?(标准与管
- Windows10如何更改任务栏高度_Win10解
- Python配置文件操作教程_JSONINIYAM
- 如何在Golang中配置代码格式化工具_使用gof
- Win11快速助手怎么用_Win11远程协助连接教
- Python类装饰器使用_元编程解析【教程】
- php485支持哪些操作系统_php485跨系统支
- Win11怎么关闭搜索历史 Win11清除搜索框最
- Win11怎么清理C盘OneDrive缓存_Win
- c++中的std::conjunction和std
- Win10怎样安装Excel数据分析工具_Win1
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Win11怎么更改系统语言为中文_Windows1
- 为什么Go需要go mod文件_Go go mod
- Windows10蓝屏SYSTEM_SERVICE
- Go 中实现 Python urllib.quot
- Win11如何卸载OneDrive_Win11卸载
- C++中的std::shared_from_thi
- Windows10如何更改桌面背景_Win10个性
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- c++中的可变参数模板(variadic temp
- Linux如何使用Curl发送请求_Linux下A
- Win11怎么设置开机自动连接宽带_Windows
- c++怎么用jemalloc c++替换默认内存分
- Python安全爬虫设计_IP代理池与验证码识别策
- Win11怎么开启远程桌面_Win11系统远程桌面
- XAMPP 启动失败(Apache 突然停止)的终
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动

分离,使其独立扩展。定义Abstraction(遥控器)持有Implementor(设备)指针,各自形成类层级:Device为实现基类,TV和Radio提供具体实现;Remote为抽象基类,BasicRemote和EnhancedRemote扩展高层行为。运行时动态绑定,如BasicRemote控制TV,EnhancedRemote控制Radio,新增设备或遥控器无需修改对方代码,符合开闭原则。
QQ客服