C++设计模式——Bridge模式(上)

一、什么是桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分和实现部分解耦,使得它们可以独立地变化。该模式使用了组合关系来替代继承,从而达到降低系统复杂度的目的。C++作为一门面向对象的编程语言,自然也可以使用桥接模式来解决相关问题。在本篇文章中,我们将会详细介绍C++桥接模式的实现原理,以及如何使用该模式来优化代码结构和可维护性。

二、桥接模式的定义与组成结构

桥接模式(Bridge Pattern)定义了如何将抽象和实现分离,以便两者可以独立地变化。桥接模式通常使用组合关系而不是继承关系来完成此任务。桥接模式包含四个部分:抽象部分(Abstraction)、实现部分(Implementor)、扩展抽象部分(Refined Abstraction)和具体实现部分(Concrete Implementor)。

三、桥接模式实现的步骤

在使用桥接模式时,通常需要按照以下步骤进行实现:
1、定义抽象部分的接口,并将其与实现部分的接口解耦。
2、定义实现部分的接口,并实现其具体实现。
3、在抽象部分中包含一个指向实现部分的指针,并在实现部分中包含一个指向抽象部分的指针。
4、定义扩展抽象部分,并在其中调用实现部分的接口。
5、定义具体实现部分,并实现其具体实现。
6、在客户端代码中创建抽象部分的对象,并通过传递具体实现部分的对象来设置实现部分的指针。
7、调用抽象部分的接口,实现具体的功能。

四、代码示例

#include <iostream>
using namespace std;class Implementor;/*** @brief The Abstraction class* 抽象类,持有实现类指针*/
class Abstraction
{
public:Abstraction(Implementor* pImpl):m_pImpl(pImpl){}virtual ~Abstraction(){}virtual void operation() = 0;
protected:Implementor* m_pImpl;
};/*** @brief The Implementor class* 定义了实现部分的接口,可以是抽象类或者一个接口类*/
class Implementor
{
public:virtual ~Implementor() {}virtual void OperationImpl() = 0;
};/*** @brief The RefinedAbstraction class  定义抽象拓展部分,并在其中调用实现部分的接口*/
class RefinedAbstraction : public Abstraction
{
public:RefinedAbstraction(Implementor* pImpl) : Abstraction(pImpl) {}virtual void operation() override{ m_pImpl->OperationImpl(); }
};/*** @brief The ConcreteImplementorA class 实现具体的部分*/
class ConcreteImplementorA : public Implementor
{
public:virtual void OperationImpl(){// 实现部分A的具体实现cout << __FUNCTION__ << endl;}
};class ConcreteImplementorB : public Implementor
{
public:virtual void OperationImpl(){// 实现部分B的具体实现cout << __FUNCTION__ << endl;}
};int main()
{Implementor* pImpl = new ConcreteImplementorA();Abstraction* abs = new RefinedAbstraction(pImpl);abs->operation();return 0;
}

五、总结

桥接模式适用于以下几种场景:

1、当需要避免由于实现部分和抽象部分的紧耦合关系而导致系统的维护和扩展变得困难时,可以使用桥接模式。例如,一个大型系统中有多个平台和多个应用程序,需要将它们组合起来实现特定的功能,此时就可以使用桥接模式将平台和应用程序解耦。

2、当需要在多个对象之间共享一些通用功能时,可以使用桥接模式。例如,在一个多媒体应用程序中,需要在不同的媒体之间共享一些通用的功能,比如播放、暂停、停止等,此时就可以使用桥接模式来实现共享。

3、当需要在运行时动态地切换实现部分时,可以使用桥接模式。例如,在一个视频播放器中,需要支持多种视频格式,用户可以在运行时选择不同的格式,此时就可以使用桥接模式来实现动态切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java核心知识点整理大全23-笔记

目录 21. JAVA 算法 21.1.1. 二分查找 21.1.2.冒泡排序算法 21.1.3. 插入排序算法 21.1.4. 快速排序算法 21.1.1. 希尔排序算法 21.1.2. 归并排序算法 21.1.3. 桶排序算法 21.1.4. 基数排序算法 21.1.5. 剪枝算法 21.1.6. 回溯算法 21.1.7. 最短路径算法 21.1.8. 最…

正则表达式【C#】

1作用&#xff1a; 1文本匹配&#xff08;验证字符串&#xff09; 2查找字符串 2符号&#xff1a; . ^ $ * - ? ( ) [ ] { } \ | [0-9] 匹配出数字 3语法格式&#xff1a; / 表示模式 / 修饰符 /[0-9]/g 表示模式&#xff1a;是指匹配条件&#xff0c;要写在2个斜…

【C++高阶(六)】哈希的应用--位图布隆过滤器

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 哈希的应用 1. 前言2. 位图的概念以及定义3. 位…

使用 Docker 安装和配置 MySQL 数据库简介

目录 一、使用镜像安装 1、查询镜像 2、拉取镜像 3、查看本地镜像 4、启动docker镜像 二、使用Docker Compose安装 1、安装Docker和Docker Compose 2、创建Docker Compose文件&#xff1a; 3、启动MySQL容器 4、验证MySQL容器是否正常运行 5、连接到MySQL容器 6、停止…

java Stream流操作

什么是Stream&#xff1f; java8新增Stream&#xff0c;配合同版出现的Lambda&#xff0c;为集合&#xff08;Collection&#xff09;操作提供了极大的便利。 Stream将要处理的元素集合看作一种流&#xff0c;在流的过程中&#xff0c;借助Stream API对流中的元素进行操作&am…

004:Direct 2D离屏渲染(Qt中实现)

简介&#xff1a; 用QT开发图像显示的小程序&#xff0c;需要一些标注工具&#xff0c;由于用的是opengl渲染&#xff0c;所以就在内存中进行绘制&#xff0c;然后纹理贴图贴出去&#xff0c;发现Qt绘制的效果太差&#xff0c;且速度一般&#xff0c;于是就想着用direct2d来绘制…

python——第十五天

面向对象和面向对象编程 面向对象编程&#xff1a; C语言是一门面向过程的编程语言&#xff01;&#xff01;&#xff01; 面向对象的编程思想 就是分门别类的一种能力 面向对象的概念 类&#xff1a; 对一类事物的统称 对象&#xff1a; 一类事物中的具体案例 面向对象的…

python之pyqt专栏8-信号与槽4

信号重载 在上一篇python之pyqt专栏7-信号与槽3-CSDN博客&#xff0c;我们知道在自定义信号时&#xff0c;可以设定信号参数数据类型。pyqt还支持信号重载。 信号定义 sendText pyqtSignal([int],[str]) 代码意思是定义重载信号sendText&#xff0c;槽函数的参数可以是int数…

【Vulnhub 靶场】【CEREAL: 1】【困难】【20210529】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/cereal-1,703/ 靶场下载&#xff1a;https://download.vulnhub.com/cereal/Cereal.ova 靶场难度&#xff1a;困难 发布日期&#xff1a;2021年5月29日 文件大小&#xff1a;1.1 GB 靶场作者&#xff1a;Thomas…

postman打开白屏

现状&#xff1a;postman打开白屏如下图 window环境变量&#xff1a; Win R 快捷键打开 sysdm.cpl 增加环境变量&#xff1a; 变量名&#xff1a;POSTMAN_DISABLE_GPU 值&#xff1a;true 重新打开postman

不用第三方软件实现停止windows10/11更新

第一步&#xff1a;打开regedit 1&#xff1a;键盘按下winR输入regedit 2&#xff1a;按下图顺序选择 3&#xff1a;右击settings新建DWORD【32位】值 输入FlightSettingsMaxPauseDays 然后右击修改值选择十进制输入4000代表可以延迟4000天就是10年多 然后打开设置 一直…

网络运维与网络安全 学习笔记2023.11.29

网络运维与网络安全 学习笔记 第三十天 今日更新太晚啦&#xff01;&#xff01;&#xff01; 主要是今天工作时挨了一天骂&#xff0c;服了&#xff0c;下次记得骂的轻一点&#xff01;&#xff01;&#xff01; &#xff08;要不是为了那点微薄的薪资&#xff0c;谁愿意听你…

文件fd【Linux系统编程】

本文是基础IO的第一个部分&#xff0c;基础IO部分将主要讲解以下内容&#xff1a;文件fd 文件系统 软硬链接 操作系统的内存管理 以及 动静态库。本节重点讲解文件fd&#xff0c;其余内容将在后面的博客更新。 一、共识 文件 内容 属性 文件分为打开了的文件和没打开的文件。…

第二证券:股票几点到几点开盘?

作为股民或许投资者&#xff0c;我们都知道股票是每天都有开盘和收盘时间的。但是&#xff0c;关于股票的开盘时间&#xff0c;很多人并不是很清楚&#xff0c;特别是初学者。在本文中&#xff0c;我们将从多个视点分析股票开盘时间&#xff0c;并为大家供给一些有用的信息。 …

血的教训--kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】

血的教训–kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】 最近下载了一个2023版本的kail系统&#xff0c;但是经过几次设置免密后&#xff0c;ssh过去一直让提供密码&#xff0c;所以就仔细的分析了一下&#xff0c;果然还是发现了点猫腻 接上一个博客&#xff0c;大…

CSS新手入门笔记整理:CSS边框样式

边框宽度&#xff1a;boder-width 语法 boder-width:像素值&#xff1b; 边框样式&#xff1a;boder-style 语法 boder-style:取值&#xff1b; 属性值 说明 none 无样式 dashed 虚线 solid 实线 边框颜色&#xff1a;boder-color 语法 boder-color:色值&#xf…

Mysql之子查询(知识点+例题)

Mysql之子查询<知识点例题> 什么是子查询案例分析案例分析子查询的分类单行子查询子查询中的空值问题题目练习题目一题目二题目三题目四题目五补充&#xff1a;聚合函数与GROUP BY的使用关系 CASE表达式&#xff08;子查询中的运用&#xff09;简单CASE表达式搜索CASE表达…

电脑突然死机怎么办?教你几招快速拯救

当今社会&#xff0c;电脑成为我们日常生活和工作不可或缺的一部分。然而&#xff0c;有时电脑可能会突然死机&#xff0c;给我们的操作和数据带来不便。那电脑突然死机怎么办呢&#xff1f;本文将介绍解决电脑突然死机的三种方法&#xff0c;通过详细的步骤指南&#xff0c;帮…

类 —— 继承、多重继承

继承 一个类&#xff0c;继承另一个已有的类。&#xff08;在一个已存在的类的基础上建立一个新的类&#xff0c;并拥有其特性&#xff09; 是一个父类&#xff08;基类&#xff09;派生出子类&#xff08;派生类&#xff09;的过程。 派生类往往是基类的具象化&#xff0c;基…

接口测试之测试原则、测试用例、测试流程......

一、接口的介绍 软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&#xff08;API&#xff09;。 接口&#xff08;API&#xff09;是系统与系统之间&#xff0c;模块与模块之间或者…