C++ 【桥接模式】

简单介绍

桥接模式属于 结构型模式 | 可将一个大类或一系列紧密相关的类拆分 为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。

聚合关系:两个类处于不同的层次,强调了一个整体/局部的关系,当汽车对象销毁时,轮胎对象也可以单独存在

public class 轮胎{  }
public class 汽车{protected:轮胎 tyre[4];
}

基础理解

Q:为什么要用桥接模式
A:使得抽象部分和实现部分分离,使它们可以独立地变化。且允许抽象部分和实现部分之间建立多对多的关系形成 聚合关系

Q:什么是抽象什么是实现
A:抽象 是一些实体的高阶控制层。抽象调用实现,实现来完成具体实现的工作

这里的形状就是抽象,与涂颜色(实现)形成聚合关系:抽象包含涂颜色
在这里插入图片描述

UML 图

解释:客户端只需要调用抽象部分。抽象部分与实现部分成为聚合关系。你可以详写一个精确的抽象,然后就可以在客户端用这个精确的抽象调用具体的实现。


空心箭头:继承关系
实线箭头:关联关系
棱形实线箭头:聚合关系
在这里插入图片描述

抽象部分和实现部分

在实际的程序中, 你可以在两个独立方向上扩展这种应用:

开发多个不同的 精确抽象 (例如:面向微信用户和支付宝用户 )
支持多个不同的 具体实现 (例如:能够使用 密码支付 人脸支付 和 指纹支付)。

  1. 抽象对象控制程序的外观
    (微信用户和支付宝用户抽象成用户,通过这些抽象对象,我们可以统一对支付进行管理和调用,而不需要关心具体的支付实现方式。)
  2. 并将真实工作委派给连入的实现对象
    (抽象类与实现类发生聚合关系,抽象类可以调用密码支付 人脸支付 和 指纹支付方式)
  3. 不同的实现只要遵循相同的接口就可以互换
    (只要遵循了相同的接口:PaymentMode 支付接口,就可以在程序中互换使用)
  4. 精确抽象(微信用户)就可以使用多个具体实现接口( 密码支付 人脸支付 和 指纹支付)

关键点:聚合关系,精确抽象类构造函数中对不同API 的调用

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;// 支付方式接口
class PaymentMode
{
public:virtual ~PaymentMode() {}virtual bool security(string uId) = 0;
};// 具体支付方式实现类:密码支付
class PayByCypher : public PaymentMode
{
public:bool security(string uId) override{cout << "密码支付的安全检查" << endl;// 实现具体的安全验证逻辑return true;
}
}
;// 具体支付方式实现类:人脸支付
class PayByFace : public PaymentMode
{
public:bool security(string uId) override{cout << "人脸支付的安全检查" << endl;// 实现具体的安全验证逻辑return true;}
};// 具体支付方式实现类:指纹支付
class PayByFingerprint : public PaymentMode
{
public:bool security(string uId) override{cout << "指纹支付的安全检查" << endl;// 实现具体的安全验证逻辑return true;}
};// 支付抽象类
class Payment
{
public:Payment(PaymentMode *mode_) : mode(mode_) {}virtual ~Payment() {}virtual void pay(string uId, string tradeId, long long amount) = 0;protected:PaymentMode *mode;
};// 扩展抽象化角色:微信支付
class WxPayment : public Payment
{
public:WxPayment(PaymentMode *mode) : Payment(mode) {}void pay(string uId, string tradeId, long long amount) override{cout << "使用微信支付" << endl;bool isSecure = mode->security(uId);if (isSecure){cout << "微信支付成功,交易号:" << tradeId << ",金额:" << amount << endl;}else{cout << "微信支付失败,交易号:" << tradeId << ",金额:" << amount << endl;}}
};// 扩展抽象化角色:支付宝支付
class AliPayment : public Payment
{
public:AliPayment(PaymentMode *mode) : Payment(mode) {}void pay(string uId, string tradeId, long long amount) override{cout << "支付宝支付开始" << endl;bool isSecure = mode->security(uId);if (isSecure){cout << "支付宝支付成功,交易号:" << tradeId << ",金额:" << amount << endl;}else{cout << "支付宝支付失败,交易号:" << tradeId << ",金额:" << amount << endl;}}
};int main()
{PaymentMode *cypherMode = new PayByCypher();PaymentMode *faceMode = new PayByFace();Payment *wxPayment = new WxPayment(cypherMode);Payment *aliPayment = new AliPayment(faceMode);wxPayment->pay("user123", "123456", 100);aliPayment->pay("user456", "789012", 200);delete cypherMode;delete faceMode;delete wxPayment;delete aliPayment;system("pause");return 0;
}

应用场景

如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式。

桥接模式可以将庞杂类拆分为几个类层次结构。 此后, 你可以修改任意一个类层次结构而不会影响到其他类层次结构。 这种方法可以简化代码的维护工作, 并将修改已有代码的风险降到最低。

如果你需要在运行时切换不同实现方法, 可使用桥接模式。

当然并不是说一定要实现这一点, 桥接模式可替换抽象部分中的实现对象,只需要在抽象部分中引入实现对象,并通过接口进行交互。

顺便提一句, 最后一点是很多人混淆桥接模式和策略模式的主要原因。 记住, 设计模式并不仅是一种对类进行组织的方式, 它还能用于沟通意图和解决问题。
(在实现上有点像但是策略模式主要是针对算法,根据你的具体情况使用合适的策略算法)

与其他模式的关系

  1. 桥接、 状态模式和策略模式 (在某种程度上包括适配器) 模式的接口非常相似。 实际上, 它们都基于聚合模式——即将工作委派给其他对象, 不过也各自解决了不同的问题。 模式并不只是以特定方式组织代码的配方, 你还可以使用它们来和其他开发者讨论模式所解决的问题。
  2. 你可以结合使用生成器模式和桥接模式: 主管类(定义调用构造步骤的顺序)负责抽象工作, 各种不同的生成器(会生成具体的产品)负责实现工作。
  3. 桥接模式通常会于开发前期进行设计, 使你能够将程序的各个部分独立开来以便开发。 另一方面, 适配器(为各种接口进行兼容和匹配)模式通常在已有程序中使用, 让相互不兼容的类能很好地合作。

浅薄理解,如果有错还望指正。谢谢大家。

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

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

相关文章

记录重装ubuntu系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言无法进入ubuntu图形化界面进入ubuntu的tty模式开始解决误打误撞进入X-Window界面&#xff0c;拷贝ubuntu系统文件重装ubuntu系统 前言 提示&#xff1a;这里可…

面试(04)————JavaWeb

1、网络通讯部分 1.1、 TCP 与 UDP 区别&#xff1f; 1.2、什么是 HTTP 协议&#xff1f; 1.3、TCP 的三次握手&#xff0c;为什么&#xff1f; 1.4、HTTP 中重定向和请求转发的区别&#xff1f; 1.5、 Get 和 Post 的区别&#xff1f; 2、cookie 和 session 的区别&am…

Linux:部署搭建zabbix6(1)

1.基础介绍 Zabbix&#xff1a;企业级开源监控解决方案https://www.zabbix.com/cn这个是zabbix的官网&#xff0c;你可以进去看到由官方给你提供的专业介绍和获取到最新版本的功能介绍&#xff0c;还有各种安装&#xff0c;由于官方安装是多种复杂的&#xff0c;我这里就单独挑…

第21次修改了可删除可持久保存的前端html备忘录:重新布局

第21次修改了可删除可持久保存的前端html备忘录&#xff1a;更改了布局 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

「 典型安全漏洞系列 」11.身份验证漏洞详解

身份验证是验证用户或客户端身份的过程。网站可能会暴露给任何连接到互联网的人。这使得健壮的身份验证机制成为有效的网络安全不可或缺的一部分。 1. 什么是身份验证 身份验证即认证&#xff0c;是验证给定用户或客户端身份的过程。身份验证漏洞使攻击者能够访问敏感数据和功…

设计模式——组合模式08

组合模式&#xff1a;把类似对象或方法组合成结构为树状的设计思路。 例如部门之间的关系。 设计模式&#xff0c;一定要敲代码理解 抽象组件 /*** author ggbond* date 2024年04月06日 08:54* 部门有&#xff1a;二级部门&#xff08;下面管三级部门&#xff09; 三级部门 &a…

爬取学习强国视频小示例

因为需要爬取的视频数量并不是很大&#xff0c;总共需要将131个视频下载下来&#xff0c;所以就直接去手动找找视频的地址和名称保存下来的。由于页面是动态加载的&#xff0c;所以我们无法在网站源码中直接找到视频的超链接。设想是可以用Selenium模拟浏览器点击进行动态加载获…

【计算机毕业设计】五台山景点购票系统,后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

008 CSS盒子模型

文章目录 盒子模型内容-宽度和高度内边距-padding边框-border圆角-border-radius 外边距-margin上下margin的传递上下margin的折叠块级元素的水平居中行内级元素(包括inline-block元素)的水平居中 外轮廓-outline盒子阴影-box-shadow文字阴影-text-shadow行内非替换元素的特殊性…

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG&#xff0c;选择xwr68xx还是xwr64xx&#xff0c;及需要注意的问题 文章目录 demo工程out_of_box文件调试bin文件名称需要注意的问题附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导…

【SCI绘图】【小提琴系列1 python】绘制按分类变量分组的垂直小提琴图

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【小提琴系列1 python】绘制按分类变量分组的垂直小提琴图&#xff0c;文末附完整代码 小提琴图是一种常用的数据可视化工具…

2. Django配置信息

第2章 Django配置信息 Django的配置文件settings.py用于配置整个网站的环境和功能, 核心配置必须有项目路径, 密钥配置, 域名访问权限, App列表, 中间件, 资源文件, 模板配置, 数据库的连接方式.* 项目运行时, 如果修改代码, 项目会自动检测发现改动后会重新运行, 除非报错否…