(二)结构型模式:2、桥接模式(Bridge Pattern)(C++实现示例)
目录
1、桥接模式(Bridge Pattern)含义
2、桥接模式应用场景
3、桥接模式的UML图学习
4、C++实现桥接模式的示例
1、桥接模式(Bridge Pattern)含义
桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。
2、桥接模式应用场景
1)当你希望抽象部分和实现部分可以独立地扩展和变化时,可以使用桥接模式。它可以让抽象部分和实现部分可以独立地进行演化,而不会相互影响。
2)当一个类存在多个维度的变化,且每个维度都需要独立地进行扩展时,可以考虑使用桥接模式。通过将每个维度的变化抽象为不同的继承层次结构,然后通过桥接模式将这些继承层次结构连接起来,可以灵活地组合不同的变化。
3)当需要在运行时动态地选择或切换抽象部分和实现部分的关系时,可以使用桥接模式。通过将抽象部分和实现部分解耦,并通过组合的方式建立关联,可以在运行时灵活地选择具体的实现。
4)当希望对抽象部分和实现部分进行共享和复用时,可以考虑使用桥接模式。通过将抽象部分和实现部分分离,可以使它们可以独立地进行复用,从而提高代码的可维护性和可扩展性。
总的来说,桥接模式适用于抽象部分和实现部分需要独立演化、存在多个维度的变化、需要动态选择关系或希望进行共享和复用的场景。它可以提供更好的灵活性、可扩展性和可维护性。
3、桥接模式的UML图学习

在上述UML类图中,有以下几个关键角色:
-
Abstraction(抽象类):定义了抽象部分的接口,并包含一个指向Implementor的成员变量。它的具体子类可以通过调用Implementor的方法来实现自己的操作。 -
Implementor(实现类接口):定义了实现部分的接口,它通常只提供了一些基本的操作方法。 -
ConcreteImplementorA、ConcreteImplementorB(具体实现类):实现了Implementor接口,具体实现了实现部分的操作方法。 -
RefinedAbstractionA、RefinedAbstractionB(扩展抽象类):继承自Abstraction,并通过调用Implementor的方法来实现自己的操作。
在桥接模式中,抽象部分和实现部分通过关联关系连接在一起,而不是继承关系。这样可以使得抽象部分和实现部分可以独立地变化和演化。
4、C++实现桥接模式的示例
#include <iostream>
#include <string>// 实现接口
class Implementor
{
public:virtual void operationImpl() const = 0;
};// 具体实现类A
class ConcreteImplementorA : public Implementor
{
public:void operationImpl() const override {std::cout << "ConcreteImplementorA: operationImpl" << std::endl;}
};// 具体实现类B
class ConcreteImplementorB : public Implementor
{
public:void operationImpl() const override {std::cout << "ConcreteImplementorB: operationImpl" << std::endl;}
};// 抽象类
class Abstraction {
protected:Implementor* m_implementor;public:Abstraction(Implementor* implementor) : m_implementor(implementor) {}virtual void operation() const = 0;
};// 扩展抽象类A
class RefinedAbstractionA : public Abstraction
{
public:RefinedAbstractionA(Implementor* implementor) : Abstraction(implementor) {}void operation() const override {std::cout << "RefinedAbstractionA: ";m_implementor->operationImpl();}
};// 扩展抽象类B
class RefinedAbstractionB : public Abstraction
{
public:RefinedAbstractionB(Implementor* implementor) : Abstraction(implementor) {}void operation() const override {std::cout << "RefinedAbstractionB: ";m_implementor->operationImpl();}
};int main()
{// 创建具体实现类对象Implementor* implementorA = new ConcreteImplementorA();Implementor* implementorB = new ConcreteImplementorB();// 使用扩展抽象类A调用操作Abstraction* abstractionA = new RefinedAbstractionA(implementorA);abstractionA->operation();// 使用扩展抽象类B调用操作Abstraction* abstractionB = new RefinedAbstractionB(implementorB);abstractionB->operation();delete implementorA;delete implementorB;delete abstractionA;delete abstractionB;return 0;
}
在上述示例中,我们首先定义了实现接口(Implementor),其中包含了一个纯虚函数operationImpl()。然后,我们实现了两个具体的实现类(ConcreteImplementorA和ConcreteImplementorB),它们分别继承自实现接口,并实现了接口中的纯虚函数。
接着,我们定义了抽象类(Abstraction),其中包含了一个指向实现接口的指针,并声明了一个纯虚函数operation()。然后,我们通过扩展抽象类A(RefinedAbstractionA)和扩展抽象类B(RefinedAbstractionB)来实现具体的抽象类,它们分别继承自抽象类,并实现了抽象类中的纯虚函数。
在主函数中,我们创建了具体的实现类对象(implementorA和implementorB),然后通过扩展抽象类A和扩展抽象类B来调用操作。在调用操作时,实际上会调用到具体的实现类中的具体函数。
相关文章:
(二)结构型模式:2、桥接模式(Bridge Pattern)(C++实现示例)
目录 1、桥接模式(Bridge Pattern)含义 2、桥接模式应用场景 3、桥接模式的UML图学习 4、C实现桥接模式的示例 1、桥接模式(Bridge Pattern)含义 桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离&#…...
FPGA_学习_16_IP核_ROM
在寻找APD最合适的偏压的过程中,一般会用到厂商提供一条曲线,横坐标是温度的变化,纵坐标表示击穿偏压的变化,但每个产品真正的击穿偏压是有差异的。 为了能够快速的找到当前温度下真实的击穿偏压,我们可以这样做&#…...
机器学习---对数几率回归
1. 逻辑回归 逻辑回归(Logistic Regression)的模型是一个非线性模型, sigmoid函数,又称逻辑回归函数。但是它本质上又是一个线性回归模型,因为除去sigmoid映射函 数关系,其他的步骤,算法都是…...
网络通信原理IP头部格式(第四十二课)
字段作用解析:1)版本: 指的IP地址的版本 (IPv4 或 IPV6)2)首部长度: 次数据包的首部长度一共是多少,没有加可选项3)优先级与服务类型:表示****数据包是否需要优选传递4)总长度: 表示的是整个数据包的大小,也就****是首部+数据5)标识符、标志、段偏移量:的作用将拆开的…...
Flink多流处理之join(关联)
Flink的API中只提供了join的算子,并没有left join或者right join,这里我们就介绍一下join算子的使用,其实join算子底层调用的就是coGroup,具体原理这里就不过多介绍了,如果感兴趣可以看我前面发布的文章Flink多流操作之coGroup. 数据源➜ ~ nc -lk 1111 101,A 102,B 103,C 10…...
LeetCode Top100 Liked 题单(序号34~51)
34. Find First and Last Position of Element in Sorted Array 题意:找到非递减序列中目标的开头和结尾 我的思路 用二分法把每一个数字都找到,最后返回首尾两个数 代码 Runtime12 ms Beats 33.23% Memory14 MB Beats 5.16% class Solution {…...
视觉slam十四讲---第一弹三维空间刚体运动
1.旋转矩阵 1.1内积 1.2外积 1.3坐标系间的欧式变换 相机运动是一个刚体运动,它保证了同一个向量在各个坐标系下的长度和夹角都不会 发生变化。这种变换称为欧氏变换。 旋转矩阵:它是一个行列式为 1 的正交矩阵。 旋转矩阵为正交阵,它的逆…...
手把手教你配置Jenkins自动化邮件通知
完成基于Jenkins的持续集成部署后,自动化测试执行后,测试结果需要通知到相关人员,除了钉钉通知外我们还可以通过Email通知到对应负责人,这里记录一下测试结果通过Jenkins邮件通知的配置与部署 01、安装插件 方法1: 进…...
Arcgis连续数据的分类(求不同值域的面积)
问题描述:如果得到的一个连续的影响数值数据,但是我们想求取某一段值域的面积占比,需要进行以下操作: 1.按照数值重分类,将某段数值变成一个类别 2.栅格转矢量,再求取面积...
C++ 函数
函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常…...
关于如何创建一个windows窗口的exe文件
如何创建一个windows窗口exe文件,具体参照这个博主: http://t.csdn.cn/pfQK5 以下是实现代码,注意用vs打开: #pragma comment( linker, "/subsystem:\"windows\" /entry:\"WinMainCRTStartup\"" …...
re学习(33)攻防世界-secret-galaxy-300(动态调试)
下载压缩包: 下载链接:https://adworld.xctf.org.cn/challenges/list 参考文章:攻防世界逆向高手题之secret-galaxy-300_沐一 林的博客-CSDN博客 发现这只是三个同一类型文件的三个不同版本而已,一个windows32位exe࿰…...
springboot工程集成前端编译包,用于uni-app webView工程,解决其需独立部署带来的麻烦,场景如页面->画布->图片->pdf
前端工程 访问方式 http://127.0.0.1:8080/context/frontEnd/index放行 public class SecurityConfig extends WebSecurityConfigurerAdapter { "/frontEnd/**",SysFrontEndController import lombok.extern.slf4j.Slf4j; import nl.basjes.shaded.org.springfram…...
NeuralNLP-NeuralClassifier的使用记录(二),训练预测自己的【中文文本多分类】
NeuralNLP-NeuralClassifier的使用记录,训练预测自己的【中文文本多分类】 数据准备: 与英文的训练预测一致,都使用相同的数据格式,将数据通过代码处理为JSON格式,以下是我使用的一种,不同的原数据情况…...
express学习笔记8 - 文件上传 下载以及预览
一、上传 1、 安装multer (任意选其中一种) yarn add multer --S npm install multer --S 2、新建配置文件(utils/multerConfig) const multer require(multer); const mkdirp require(mkdirp); // const sd require(silly-datetime); const path require(path);con…...
Python系统学习1-9-类(一)
一、类之初印象 1、类就是空表格,将变量(列名)和函数(行为)结合起来 2、创建对象,表达具体行 3、创建类就是创建数据的模板 --操作数据时有提示 --还能再组合数据的行为 --结构更加清晰 4、类的内存分配…...
什么是公网、私网、内网、外网?
中午好,我的网工朋友。 最近经常有很多小白朋友在问,公网、私网、内网、外网,这些的概念是啥样的,又该怎么去界定。 关于IP地址,确实没有太明确的区分,其实也不必太过咬文嚼字。 内网、外网就是一个参考…...
一篇文章教会你搭建私人kindle图书馆,并内网穿透实现公网访问
搭建私人kindle图书馆,并内网穿透实现公网访问 在电子书风靡的时期,大部分人都购买了一本电子书,虽然这本电子书更多的时候是被搁置在储物架上吃灰,或者成为盖泡面的神器,但当亚马逊发布消息将放弃电子书在中国的服务…...
好用的安卓手机投屏到mac分享
工具推荐:scrcpy github地址:https://github.com/Genymobile/scrcpy/tree/master mac使用方式 安装环境,打开terminal,执行以下命令,没有brew的先安装brew brew install scrcpy brew install android-platform-too…...
df -h
df -h 命令用于查看磁盘占用的空间 Filesystem:表示该文件系统位于哪个分区,因此该列显示的是设备名称; Used:表示用掉的磁盘空间大小; Available:表示剩余的磁盘空间大小; Use%:磁盘…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
