当前位置: 首页 > news >正文

桥接模式

对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖顾关系限制了灵活性并最终限制了复用性[DP]。
合成/聚合复用原则(CARP),尽量使用合成/集合,尽量不要使用类继承。

**桥接模式(Bridge):**将抽象部分与它的实现部分分离,使它们都可以独立地变化。
在这里插入图片描述
AbstractionImp.h

#ifndef ABSTRACTIONIMP_H
#define ABSTRACTIONIMP_Hclass AbstractionImp {
public:virtual ~AbstractionImp() = default;virtual void Operation();AbstractionImp() = default;
};class ConcretetAbstractionImpA : public AbstractionImp {
public:ConcretetAbstractionImpA() = default;~ConcretetAbstractionImpA() override = default;void Operation() override;
};class ConcretetAbstractionImpB : public AbstractionImp {
public:ConcretetAbstractionImpB() = default;~ConcretetAbstractionImpB() override = default;void Operation() override;
};#endif //ABSTRACTIONIMP_H

AbstractionImp.cpp

#include <iostream>
#include "AbstractionImp.h"using namespace std;void AbstractionImp::Operation() {cout << "AbstractionImp....imp..." << endl;
}void ConcretetAbstractionImpA::Operation() {cout << "ConcreteAbstractionImpA...." << endl;
}void ConcretetAbstractionImpB::Operation() {cout << "ConcreteAbstractionImpB...." << endl;
}

Abstraction.h

#ifndef ABSTRACTION_H
#define ABSTRACTION_H#include "AbstractionImp.h"class Abstraction {
public:virtual ~Abstraction();virtual void Operation() = 0;
protected:Abstraction();
};class RefinedAbstraction : public Abstraction {
public:explicit RefinedAbstraction(AbstractionImp *imp);~RefinedAbstraction() override;void Operation() override;
protected:AbstractionImp *_imp;
};
#endif //ABSTRACTION_H

Abstraction.cpp

#include "abstraction.h"Abstraction::~Abstraction() = default;Abstraction::Abstraction() = default;RefinedAbstraction::RefinedAbstraction(AbstractionImp *imp) {_imp = imp;
}RefinedAbstraction::~RefinedAbstraction() = default;void RefinedAbstraction::Operation() {_imp->Operation();
}

main.cpp

#include <iostream>
#include "Abstraction.h"
#include "AbstractionImp.h"using namespace std;int main() {AbstractionImp *imp = new ConcretetAbstractionImpA();Abstraction *abs = new RefinedAbstraction(imp);abs->Operation();return 0;
}
http://www.lryc.cn/news/384013.html

相关文章:

  • docker中mysql突然无法远程连接设置
  • Nuxt3 的生命周期和钩子函数(二)
  • 用英文介绍孟买:Mumbai India‘s Transforming MEGACITY
  • 镜像发布至dockerHub
  • vscode + CMake编译(opencv显示图片工程)
  • JavaScript的学习之强制类型转换
  • 天润融通:AI赋能客户体验,推动企业收入和业绩增长
  • Android与服务器交互的方式中的对称加密和非对称加密(kotlin)
  • epoch和batch的区别
  • 非递归创建二叉查找树
  • 摄影师危!AI绘画即将降维打击摄影行业
  • ts 中class
  • 深度解析RocketMq源码-高可用存储组件(四)Dledger框架日志同步流程
  • ONLYOFFICE 文档开发者版 8.1:API 更新
  • Activemq单节点在Windows下的配置部署
  • SpringBoot-注解@ImportResource引入自定义spring的配置xml文件和配置类
  • GitLab配置免密登录之后仍然需要Git登录的解决办法
  • 探索小众爱好:打造个人韧性与特色之路
  • GitHub使用教程(小白版)
  • 深度解析SD-WAN在企业组网中的应用场景
  • 【INTEL(ALTERA)】Eclipse Nios II SBT 无法从模板创建新应用程序和 BSP
  • Vue_cli搭建过程项目创建
  • 面试题4:POST 比 GET 安全?
  • Github生成Personal access tokens及在git中使用
  • 【BUG记录】条件查询没有查询结果 || MybatisPlus打印查询语句
  • 【C#】找不到属性集方法。get只读属性用了反射设置setValue肯定报错
  • 探索ChatGPT在程序员日常工作的多种应用
  • 算法与数据结构——时间复杂度详解与示例(C#,C++)
  • 面试题3:GET 和 POST 有什么区别?
  • 探索QCS6490目标检测AI应用开发(三):模型推理