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

【19】c++设计模式——>桥接模式

桥接模式的定义

C++的桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系,将系统划分成多个独立的、功能不同的类层次结构,并通过桥接类将它们连接起来。
在桥接模式中,有两个重要的概念:抽象化(Abstraction)和实现化(Implementation),它们分别对应了系统的抽象部分和实现部分。抽象化负责定义接口,并维护一个指向实现化对象的指针;实现化则负责定义具体的实现方法。

使用场景

关于桥接模式的使用对应的场景有很多,比如:
1.空调、电视等和他们对应的遥控器:空调、电视机是抽象,遥控器是实现;
2.手机品牌和手机软件:手机品牌是抽象,手机软件是实现;
3.跨品台的GUI在不同平台上运行:程序的GUI层是抽象,操作系统API是实现。
4.假设我们正在开发一个图形绘制应用程序,支持多种图形和不同的绘制渲染方式。其中,图形包括圆形、矩形等,渲染方式包括使用直线绘制、使用虚线绘制等。这两个维度的变化都可能会在未来进行扩展和修改。
就是说将具体的图形和具体的渲染桥接在一起,实现图形和渲染方式之间的解耦,我们可以在客户端代码中使用桥接模式,通过实例化具体的图形对象和具体的渲染实现对象,将它们桥接在一起,并进行绘制:

#include <iostream>// Abstract Render API
class RenderAPI {
public:virtual void renderCircle() = 0;         // 抽象的渲染圆形方法virtual void renderRectangle() = 0;      // 抽象的渲染矩形方法
};// Concrete Line Renderer
class LineRenderer : public RenderAPI {
public:void renderCircle() override {std::cout << "Render Circle with lines." << std::endl;     // 使用线条渲染圆形}void renderRectangle() override {std::cout << "Render Rectangle with lines." << std::endl;  // 使用线条渲染矩形}
};// Concrete Dashed Line Renderer
class DashedLineRenderer : public RenderAPI {
public:void renderCircle() override {std::cout << "Render Circle with dashed lines." << std::endl;    // 使用虚线渲染圆形}void renderRectangle() override {std::cout << "Render Rectangle with dashed lines." << std::endl; // 使用虚线渲染矩形}
};// Abstract Shape
class Shape {
protected:RenderAPI* renderAPI;public:Shape(RenderAPI* api) : renderAPI(api) {}virtual void draw() = 0;   // 抽象的绘制方法,具体的形状类将实现这个方法
};// Concrete Circle
class Circle : public Shape {
public:Circle(RenderAPI* api) : Shape(api) {}void draw() override {renderAPI->renderCircle();   // 调用渲染API的渲染圆形方法来绘制圆形}
};// Concrete Rectangle
class Rectangle : public Shape {
public:Rectangle(RenderAPI* api) : Shape(api) {}void draw() override {renderAPI->renderRectangle();   // 调用渲染API的渲染矩形方法来绘制矩形}
};int main() {// 创建一个圆形对象,并设置使用线条渲染的渲染APIShape* circleShape = new Circle(new LineRenderer());// 创建一个矩形对象,并设置使用虚线渲染的渲染APIShape* rectangleShape = new Rectangle(new DashedLineRenderer());// 绘制圆形circleShape->draw();// 绘制矩形rectangleShape->draw();delete circleShape;delete rectangleShape;return 0;
}

海贼王实例

对于海贼王中来说,有海军,有海贼团,不论是海军还是海贼团,他们都有自己的船,海军的船叫军舰,海贼团的船叫海贼船,因此,我们需要将船和团队分开;
船+海贼团 -->海贼船
船+海军—>军舰
对于一个海贼团或者一支海军部队来说,光有船是不完整的,船只是这个团队的抽象,如果想要让它鲜活起来就必要要有由人组成的团队,也就是抽象的具体实现。所以,在这个抽象类中包含了一个团队对象,船和团队二者之间的关系可以看做是聚合关系。
我们以草帽海贼团和斯摩格海贼团为例:

#include <iostream>
#include<string>
#include<map>
using namespace std;//不论是哪艘船上的船员肯定都是由一些个人的身份信息,为了将这些信息记录下来,先定一个存储数据的类:
//人员信息
struct Person
{Person(string name, string job, string ability, string reward, string beizhu=string()){this->name = name;this->job = job;this->ability = ability;this->reward = reward;this->beizhu = beizhu;}~Person(){cout << name << "被析构了..." << endl;}string name;     //姓名string job;      //工作string ability;  //能力string reward;   //赏金string beizhu;   //备注
};
//关于团队的成员组成可以是海贼,也可以是海军,所以先定义一个团队的抽象类
class AbstractTeam
{
public:AbstractTeam(string name):m_teamName(name) {}//获取团队姓名string getTeamName(){return m_teamName;}//给团队添加成员,用map保存,键是姓名,值是Person类void addMember(Person* p){m_infoMap.insert(make_pair(p->name,p));}//打印成员信息void show(){cout << m_teamName << ":" << endl;//遍历mapfor(const auto & item:m_infoMap){cout << "【Name: " << item.second->name<< ", Job: " << item.second->job<< ", Ability: " << item.second->ability<< ", MoneyReward: " << item.second->reward<< ", BeiZhu: " << item.second->beizhu<< "】" << endl;}}//执行任务函数,海军和海贼的任务不同,因此是纯虚函数,子类中重写virtual void executeTask() = 0;//虚析构函数,释放类时,将m_infoMap保存的团队所有成员都析构掉virtual ~AbstractTeam(){for (const auto& item : m_infoMap){delete item.second;}}
protected:string m_teamName = string();//该团队的所有成员map<string, Person*> m_infoMap;
};
//具体的团队类,路飞的草帽海贼团和斯摩格的海军团
//草帽海贼团
class CaoMaoTeam :public AbstractTeam
{
public:using AbstractTeam::AbstractTeam;//继承基类的构造函数,而不用子类重新实现相同的构造函数void executeTask() override{cout << "在海上冒险,找到 ONE PIECE 成为海贼王!" << endl;}
};
//斯摩格海军团队
class SmokeTeam :public AbstractTeam
{
public:using AbstractTeam::AbstractTeam;void executeTask()override{cout << "为了正义,先将草帽一伙一网打尽!!!" << endl;}
};
//船类
/*不论是海军还是海贼在大海上航行都需要船,虽然他们驾驶的船只不同,
但是有很多属性还是一致的,所以我们可以先定义一个船的抽象类*/
class AbstructShip
{
public:AbstructShip(AbstractTeam* team) :m_team(team) {} //团队+船void showTeam(){m_team->show();m_team->executeTask();}virtual string getName() = 0;virtual void feature() = 0; //纯虚函数描述船的特点,在不同的子类中都需要重写virtual~AbstructShip() {}
protected:AbstractTeam* m_team = nullptr; //这里将团队和船绑定在一起了
};
//梅丽号
class Merry :public AbstructShip
{
public:using AbstructShip::AbstructShip;string getName() override{return string("前进梅丽号");}void feature()override{cout << getName() << "--船首为羊头,在司法岛化身船精灵舍己救下草帽一伙" << endl;}
};
//海军无敌战舰
class HaiJunJian :public AbstructShip
{
public:using AbstructShip::AbstructShip;string getName()override{return string("无敌海军号");}void feature() override{cout << getName() << " -- 船底由海楼石建造, 可以穿过无风带的巨大炮舰!" << endl;}
};
int main()
{//草帽海贼团CaoMaoTeam* caomao = new CaoMaoTeam("草帽海贼团");Person* luffy = new Person("路飞", "船长", "橡胶果实能力者", "30亿贝里", "爱吃肉");Person* zoro = new Person("索隆", "剑士", "三刀流", "11亿1100万贝里", "路痴");Person* sanji = new Person("山治", "厨师", "隐形黑", "10亿3200万贝里", "好色");Person* nami = new Person("娜美", "航海士", "天候棒+宙斯", "3亿6600万贝里", "喜欢钱");caomao->addMember(luffy);caomao->addMember(zoro);caomao->addMember(sanji);caomao->addMember(nami);Merry* sunny = new Merry(caomao);sunny->feature();sunny->showTeam();//斯摩格SmokeTeam* smoke =  new SmokeTeam("斯摩格海军团");Person* smoker = new Person("斯摩格", "中将", "冒烟果实能力者", "", "爱吃烟熏鸡肉");Person* dasiqi = new Person("达斯琪", "大佐", "一刀流", "", "近视");smoke->addMember(smoker);smoke->addMember(dasiqi);HaiJunJian* ship = new HaiJunJian(smoke);ship->feature();ship->showTeam();delete caomao;delete sunny;delete smoke;delete ship;return 0;}

在这里插入图片描述

相关文章:

【19】c++设计模式——>桥接模式

桥接模式的定义 C的桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系&#xff0c;将系统划分成多个独立的、功能不同的类层次结…...

网络安全:六种常见的网络攻击手段

1、什么是VPN服务&#xff1f; 虚拟专用网络&#xff08;或VPN&#xff09;是您的设备与另一台计算机之间通过互联网的安全连接。VPN服务可用于在离开办公室时安全地访问工作计算机系统。但它们也常用于规避政府审查制度&#xff0c;或者在电影流媒体网站上阻止位置封锁&#…...

使用HbuilderX运行uniapp中小程序项目

下载HbuilderX&#xff0c;下载链接&#xff1a; HBuilderX-高效极客技巧 导入相关项目。下载微信开发者工具。使用微信开发者工具打开&#xff1a;注意&#xff1a;如果是第一次使用&#xff0c;需要先配置小程序ide的相关路径&#xff0c;才能运行成功。如下图&#xff0c;需…...

基于PHP的水果商城网站,mysql数据库,前台+后台,原生PHP,PHP study(小皮),完美运行,有一万字报告。

目录 演示视频 基本介绍 论文目录 购买流程 系统截图 演示视频 基本介绍 基于PHP的水果商城网站&#xff0c;mysql数据库&#xff0c;前台后台&#xff0c;原生PHP&#xff0c;PHP study&#xff08;小皮&#xff09;&#xff0c;完美运行&#xff0c;有一万字报告。 前…...

【uniapp】自定义导航栏时,设置安全距离,适配不同机型

1、在pages.json中&#xff0c;给对应的页面设置自定义导航栏样式 {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitl…...

JAVA经典百题之数组逆序输出

题目:将一个数组逆序输出。 程序分析 要将一个数组逆序输出&#xff0c;即将数组中的元素顺序颠倒过来&#xff0c;可以使用多种方法。基本思路是创建一个新数组或修改原数组&#xff0c;将元素的顺序颠倒。 方法1: 创建新数组实现 思路 创建一个新的数组&#xff0c;长度…...

vue run dev 配置nginx

由于项目有多个vue项目,在开发过程中需要联调,而不是每次发布后再联调. 比如有2个项目: main-project(主项目),test1-project. 由于是多项目,每个项目相当于有一个独立的域,这里test1-project设置域名称为test1 vue修改 在vite.config.ts中配置一个base:"/test1/"…...

Python实现RNN算法对MFCC特征的简单语音识别

Python实现RNN算法对MFCC特征的简单语音识别 1、实现步骤 借助深度学习库 TensorFlow/Keras 来构建模型 1.对标签进行编码,将文本标签转换为整数标签。 2.对 MFCC 特征数据进行填充或截断,使其长度一致,以便于输入到 RNN 模型中 3.如果是二维数据需要转成三维: Simpl…...

借助PLC-Recorder,汇川中型PLC(AM、AC系列,CODESYS平台)2ms高速采集的方法

高速数据采集要保证速度&#xff0c;也要保证时刻的准确性。在windows系统里&#xff0c;时间稳定性是个很难的问题。如果PLC发送的数据里带有时间信息&#xff0c;则可以由PLC来保证采样周期的稳定性。 从V2.12版本开始&#xff0c;PLC-Recorder软件可以处理发送电文里的时间…...

vscode package.json文件开头的{总是提升警告

警告如下 Problems loading reference https://json.schemastore.org/stylelintrc.json: Unable to load schema from https://json.schemastore.org/stylelintrc.json: read ECONNRESET. 解决如下 在设置&#xff08;settings.json&#xff09;里 新增一条属性 "ht…...

$attrs 和 $listeners (vue2vue3)

目录 透传 Attributes Attributes 继承​ 对 class 和 style 的合并 v-on 监听器继承 深层组件继承 禁用 Attributes 继承 多根节点的 Attributes 继承 vue2 $attrs 和 $listeners $attrs 概念说明 $attrs 案例 $listeners 概念说明 $listeners案例 vue3 $attr…...

嵌入式系统中的加密性能:第2部分

本系列的第1部分讨论了影响系统级密码性能的硬件和软件变量。现在&#xff0c;在第2部分中&#xff0c;我们将重点介绍两种用于测量高级后备加速器性能的方法&#xff1a;1&#xff09;驱动器级加速器测试以识别加速器或SoC内存带宽约束&#xff0c;以及2&#xff09;应用程序/…...

STM32F103 最小系统 PCB 设计与原理

这篇文章是来自我学习&#xff1a; ​​​​​​带着你从手册开始画板 STM最小系统板教程系列(一)_哔哩哔哩_bilibili​​​​​​ 这套教程的笔记&#xff0c;同时本文中也参考了其他教程以及我遇到的困惑与自答&#xff0c;最终汇总。 一、单片机最小系统 单片机最小系统是由…...

JVM篇---第十一篇

系列文章目录 文章目录 系列文章目录一、如何选择垃圾收集器?二、什么是类加载器?三、什么是 tomcat 类加载机制?一、如何选择垃圾收集器? 如果你的堆大小不是很大(比如 100MB ),选择串行收集器一般是效率最高的。 参数: -XX:+UseSerialGC 。如果你的应用运行在单核的机…...

MongoDB——window11安装mongodb5.0.21版本服务端(图解版)

目录 一、mongodb官网下载地址二、安装步骤三、配置环境变量四、运行mongodb 一、mongodb官网下载地址 mongodb官网下载地址&#xff1a;https://www.mongodb.com/try/download/community 二、安装步骤 双击运行下载好的mongodb-windows-x86_64-5.0.21-signed.msi安装包&am…...

第1次 更多的bash shell命令

1.检测程序 程序都是进程在运行&#xff0c;进程里面有很多线程&#xff0c;面试经常会问进程和线程的区别&#xff0c;线程可以访问另一个线程的什么什么的&#xff0c;这些我都听腻了&#xff0c;区别就是进程会分配程序需要的空间&#xff0c;创建线程需要的资源&#xff0c…...

工业路由器项目应用(4g+5g两种工业路由器项目介绍)

引言&#xff1a; 随着工业智能化的不断发展&#xff0c;工业路由器在各个领域的应用越来越广泛。本文将介绍两个工业路由器项目的应用案例&#xff0c;一个是使用SR500 4g工业路由器&#xff0c;另一个是使用SR800 5g工业路由器。 详情&#xff1a;https://www.key-iot.com/i…...

国产开源无头CMS,MyCms v4.7 快捷生成接口开发后台

MyCms 是一款基于 Laravel 开发的开源免费的开源多语言商城 CMS 企业建站系统。 MyCms 基于 Apache2.0 开源协议发布&#xff0c;免费且可商业使用&#xff0c;欢迎持续关注我们。技术交流 QQ 群&#xff1a;887522124 加群请备注来源&#xff1a;如gitee、github、官网等 v4…...

C++(反向迭代器)

前言&#xff1a; 上一章我们介绍了适配器&#xff0c;也提了一下迭代器适配器&#xff0c;今天我们就从反向迭代器把迭代器适配器给解释一下。 既然 都叫迭代器容器了 就说名只要接口合适他可以封装实现各种容器需求包括vector list 。 目录 1.反向迭代器设计 1.1反向迭代…...

DataX和dataX-web 集群部署及使用

&#x1f4d1; DataX和dataX-web 集群部署及使用 一 . 安装前准备 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 DataX 采用 框架 插件 的模式…...

常见的数据存储方案:选择合适的方式来管理您的数据

对于数据存储方案的选择&#xff0c;是现代企业和个人都需要面对的重要决策。本文将为您介绍几种常见的数据存储方案&#xff0c;包括关系型数据库、NoSQL数据库以及分布式文件系统。通过了解每种方案的特点、操作方式和适用业务类型&#xff0c;希望能帮助您选择合适的数据存储…...

leetcode 221 最大正方形 + 1277 统计全为1的正方形子矩阵

题目 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“…...

yolov7车牌识别(12种中文车牌类型)

12种中文车牌类型&#xff1a; 1.单行蓝牌 2.单行黄牌 3.新能源车牌 4.白色警用车牌 5 教练车牌 6 武警车牌 7 双层黄牌 8 双层武警 9 使馆车牌 10 港澳牌车 11 双层农用车牌 12 民航车牌 测试demo: 以yolov7-lite-s 为例: python detect_rec_plate.py --detect_model weigh…...

Mac PF命令防火墙

查看所有网络接口及其名称 ifconfig -a 文件目录&#xff1a;/etc/pf.conf 在文件末尾添加以下行&#xff1a; block drop from IP_ADDRESS其中&#xff0c;"IP_ADDRESS"是您要屏蔽的IP地址。 输入以下命令以重新加载pf防火墙配置文件&#xff1a; sudo pfctl …...

prototype-based learning algorithm(原型学习)

Prototype-based learning&#xff08;原型学习&#xff09;是一种机器学习方法&#xff0c;它的核心思想是通过存储一组代表性的样本&#xff08;原型&#xff09;&#xff0c;然后使用这些原型来进行分类、回归或聚类等任务。这种方法模拟了人类学习的方式&#xff0c;人们往…...

【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【遍历求和】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&am…...

PHP知识大全

PHP知识大全 1. 变量如何定义&#xff1f;如何检查变量是否定义&#xff1f;如何删除一个变量&#xff1f;怎样检测变量是否设置&#xff1f; $定义 isset()// 检测变量是否设置 defined&#xff08;&#xff09;// 检测常量是否设置unset()//销毁指定的变量 empty()// 检测…...

Jmeter常用参数化技巧总结!

说起接口测试&#xff0c;相信大家在工作中用的最多的还是Jmeter。 JMeter是一个100&#xff05;的纯Java桌面应用&#xff0c;由Apache组织的开放源代码项目&#xff0c;它是功能和性能测试的工具。具有高可扩展性、支持Web(HTTP/HTTPS)、SOAP、FTP、JAVA 等多种协议。 在做…...

iTunes更新iOS17出现发生未知错误4000的原因和解决方案

有不少人使用iTunes更新iOS 17时出现「无法更新iPhone发生未知的错误4000」的错误提示&#xff0c;不仅不知道iTunes升级失败的原因&#xff0c;也无从解决iPhone无法更新4000的问题。 小编今天就分享iPhone更新iOS系统出现4000错误提示的原因和对应的解决方案。 为什么iPhone…...

微信小程序 table表格 固定表头和首列 右侧表格可以左右滚动

(一) 1.左侧一列固定不动 2.右侧表格内容可以左右滚动 3.单元格内容平均分配 4.每一行行高可以由内容撑开 通过 js 设置左侧一列行高与右侧表格内容行高保持一致 1.1 效果图 1.2 tabble.wxml <view classtable><!-- 左侧固定 --><view classtable_left_colum…...

南昌网站建设方案优化/免费的黄冈网站有哪些

/*** 安全管理器* 注&#xff1a;使用shiro-spring-boot-starter 1.4时&#xff0c;返回类型是SecurityManager会报错&#xff0c;直接引用shiro-spring则不报错*/Beanpublic DefaultWebSecurityManager securityManager(UserRealm userRealm) {DefaultWebSecurityManager secu…...

wordpress安装网站源码/淘客推广

***前言*** 假期里粗略的看了一遍《架构之美》&#xff0c;对软件架构有了自己的理解。在周一的第一节《软件架构》课上&#xff0c;老师用了一个房屋改造的引例来开展软件构造的概论内容&#xff0c;这个引例让我对软件架构有了更深刻的理解&#xff0c;下面结合这个引例谈一些…...

m开头的网站建设公司/网络链接推广

虚拟化 1、什么是虚拟化 是一种计算机资源管理技术&#xff0c;虚拟化的本质就是将物理设备进行逻辑化&#xff0c;转成文件夹或文件&#xff0c;实现软硬件解耦。 虚拟化的作用 通过该技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机&#xff…...

哪个网站专业做安防/什么网站都能打开的浏览器

gstreamer及相关插件编译完成后&#xff0c;会输出gst-inspect可执行文件&#xff0c;相关信息如下&#xff1a; drwxrwxr-x 12 yingc yingc 4096 6月 15 16:56 glib-2.42.0/ drwxrwxr-x 10 yingc yingc 4096 6月 15 17:05 gst-libav-1.4.5/ drwxrwxr-x 14 yingc yingc …...

angeljs做的网站/电话营销外包公司

关注云报洞察深一度从单机软件到SaaS云服务&#xff0c;从单模块到一体化&#xff0c;中国人力资源数字化进程已经发展了二十多年&#xff0c;那么&#xff0c;到底什么才是企业人力资源部门真正需要的软件呢&#xff1f;在经过不断试错和纠偏&#xff0c;洞察和实践后&#xf…...

wordpress测试301/网络优化工程师前景如何

oracle的dump工具和分析trc文件工具ass.awk之前介绍了oracle的一个hang住时的一个分析工具hanganalyze&#xff0c;这里再引入另外的一个工具&#xff0c;分析系统进程和单个进程的工具1、在能登录数据库时&#xff0c;可以使用如下语句&#xff1a;跟踪进程对象的debug的方法&…...