新闻中心

C++怎么实现一个桥接设计模式_C++结构型模式与实现和抽象分离

2025-11-20
浏览次数:
返回列表
桥接模式通过分离抽象与实现使其独立变化,C++中以接口类定义实现并由抽象类持其指针,实现动态切换与解耦。

c++怎么实现一个桥接设计模式_c++结构型模式与实现和抽象分离

桥接模式的核心是把抽象部分和实现部分分离,让它们可以独立变化。在C++中,这通常通过将“实现”抽象为一个接口类,并在“抽象”类中持有该接口的指针来实现。这样,修改实现不会影响抽象的使用,也能动态切换不同的实现。

定义实现接口(Implementor)

先定义一个实现类的基类,它提供底层操作的接口:

class Implementor {
public:
    virtual ~Implementor() = default;
    virtual void operationImpl() = 0;
};

比如有两个具体实现:

class ConcreteImplementorA : public Implementor {
public:
    void operationImpl() override {
        std::cout << "ConcreteImplementorA operation\n";
    }
};
<p>class ConcreteImplementorB : public Implementor {
void operationImpl() override {
std::cout << "ConcreteImplementorB operation\n";
}
};</p>

定义抽象类(Abstraction)

抽象类持有一个指向实现的指针,并通过它调用实际操作:

class Abstraction {
protected:
    Implementor* impl;
<p>public:
Abstraction(Implementor* i) : impl(i) {}</p><pre class='brush:php;toolbar:false;'>virtual ~Abstraction() = default;

virtual void operation() {
    impl->operationImpl();
}

void setImplementor(Implementor* i) {
    impl = i;
}

};

小云雀 小云雀

剪映出品的AI视频和图片创作助手

小云雀 1949 查看详情 小云雀

可以扩展抽象类而不影响实现:

class RefinedAbstraction : public Abstraction {
public:
    RefinedAbstraction(Implementor* i) : Abstraction(i) {}
<pre class='brush:php;toolbar:false;'>void operation() override {
    std::cout << "RefinedAbstraction: ";
    impl->operationImpl();
}

};

使用示例

客户端代码可以灵活组合抽象和实现:

int main() {
    Implementor* implA = new ConcreteImplementorA();
    Implementor* implB = new ConcreteImplementorB();
<pre class='brush:php;toolbar:false;'>Abstraction* abs = new RefinedAbstraction(implA);
abs->operation(); // 输出:RefinedAbstraction: ConcreteImplementorA operation

abs->setImplementor(implB);
abs->operation(); // 输出:RefinedAbstraction: ConcreteImplementorB operation

delete implA;
delete implB;
delete abs;

return 0;

}

这种结构让“类的继承体系”和“实现方式”解耦。比如你可以新增一个 ConcreteImplementorC 而不需要改动任何抽象类,也可以增加新的抽象子类而无需修改实现。

关键点总结:

  • 实现与抽象分离,各自独立扩展
  • 避免类爆炸:不用为每种组合写一个子类
  • 运行时可切换实现
  • 使用组合而非继承来连接抽象和实现

基本上就这些。桥接模式适合在有多维度变化、且希望保持扩展灵活性的场景中使用。

以上就是C++怎么实现一个桥接设计模式_C++结构型模式与实现和抽象分离的详细内容,更多请关注其它相关文章!


# 配置文件  # 常宁店铺推广招聘网站  # 房地产营销推广的手段  # 永图网络营销推广公司  # seo外链建设难吗  # 菜鸟如何推广自己的网站  # 南宁微博营销号的推广费  # 电商关键词匹配方式排名  # 广东网站优化厂家报价  # 网站百度优化推广  # 企业网站是推广产品吗  # c++  # 多线程  # 解决方法  # 怎么做  # 重写  # 而不  # 有什么  # 抽象类  # 桥接  # 子类 


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


相关推荐: 微信网页版官方入口教程 微信网页版网页版快速登录步骤  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  msn官网入口地址手机版 msn官方网站手机最新链接  深入理解J*a合成构造器:何时以及为何阻止其生成  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  深入理解J*aScript中的B样条曲线与节点向量生成  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  CSS子选择器:如何区分并样式化嵌套列表的子层级  J*aScript map 方法中处理循环元素为空数组的策略  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  Flexbox布局实践:实现粘性导航栏与底部固定页脚  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  在Qt QML中通过Python字典动态更新TextEdit内容的教程  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  Composer如何解决json扩展缺失的错误  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  Kafka Streams中基于消息头条件过滤消息的实现指南  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  《刺客信条:影》PS5 Pro和Switch 2画面对比  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  mcjs网页版在线存档 mcjs云存档登录入口  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  PDF文件体积过大处理_PDF压缩技巧详解  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  b站怎么删除评论_b站评论管理与删除操作  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  Go RPC HTTP服务正确实现与常见陷阱解析  抖音创作助手登录入口_抖音创作辅助工具官网直达  精准捕获:如何在页面中监听除特定元素外的所有点击事件  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  J*aScript中针对特定容器内图片动画的实现教程  Promise错误处理:在catch后终止链式then执行的策略  提升Kafka消费者健壮性:会话超时处理与消息处理语义  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  京东单号查询入口_京东快递订单追踪入口  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  Python中高效访问嵌套字典与列表中的键值对  如何在Promise链中有效终止错误处理后的执行  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  优化大型XML文件解析:基于Python流式处理的内存高效方案 

搜索