桥接(Bridge)模式

news2024/11/23 2:41:03

目录

  • 动机
  • 使用场景
  • 参与者
  • 优劣
  • 协作
  • 实现
  • 相关模式
  • 应用和思考

桥接模式是将抽象部分和它的实现部分分离,使他们都可以独立的变化的对象结构型模式。桥接模式通过将继承改为组合的方式来解决问题;具体来说就是抽取其中一个维度并使之成为独立的类层次。

动机

当一个抽象有多个实现时,通常用继承来协调他们。抽象类定义对该接口的抽象,具体的子类则用不同方式加以实现,但此方式使得继承机制将抽象部分与它的实现部分固定在一起,难以对抽象部分和实现部分独立的进行修改,扩充和重用;

使用场景

  • 不希望在抽象和他的实现部分之间有一个固定的绑定关系,这种情况可能是因为,在程序运行时刻,实现部分应可以被选择或者切换
  • 抽象和实现都可以通过生成子类的方式加以扩充,这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充
  • 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译(对抽象的实现进行修改,不需要桥接模式就可以实现?)
  • 想对客户完全隐藏抽象的实现部分。在C++中类的表示在类接口中是可见的
  • 有许多类要生成,这样的一种类层次结构说明必须将一个对象分解成两部分
  • 想在多个对象间共享实现,但同时要求客户不知道这一点——使用场景
  • 如果想拆分或重组一个具有多重功能的庞杂类,可以使用桥接模式
  • 如果希望在几个独立维度上扩展一个类,可以使用该模式

参与者

  • Abstraction:
    • 定义抽象类接口
    • 维护一个指向Implementor类型对象的指针
  • RefeinedAbstraction:扩充由Abstraction定义的接口
  • Implementor:定义实现类的接口,这些接口不一定要与Abstraction一致,事实上可以完全不同。一般来说Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作
  • ConcreImplementor:实现Implementor接口并定义它的具体实现

优劣

  • 优点
    • 分离接口及其实现部分。一个实现未必不变的绑定在一个接口上,抽象类的实现可以在运行时刻配置,一个对象甚至可以在运行时刻改变他的实现;另外接口和实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分只需要知道Abstraction和Implementor即可。
    • 提高可扩充性。可以独立的对Abstraction和Implementor层次结构进行扩充
    • 隐藏了实现细节:对外提供的class要暴露其API(不管是public,private或protected)和数据成员,桥接模式可以避免对外暴露这些细节,只需要提供对外公共接口即可。同时,头文件可能需要包含各种库,但是将实现放在Implementor中可以避免这些包含,从而也保证了提供一个想对简洁的对外头文件。
    • 修改隐藏的Implementor类的数据成员不会影响二进制兼容。
    • 提高编译时间
  • 缺点

协作

Abstraction将client的请求转发给它的Implementor对象

实现

  • 仅有一个Implementor:在仅有一个实现的时候,没有必要创建一个抽象的Implementor
  • 创建正确的Implementor对象:当存在多个Implementor类的时候,应该用何种方法,在何时何地创建哪个Implementor对象
  • 共享Implementor对象
  • 采用多重继承机制
  • 怎样将正确的Implementor对象传给Abstraction对象?怎样使用抽象工厂来创建和配置一个特定的Bridge模式

相关模式

  • 抽象工厂可以用来创建和配置一个特定的Bridge模式
  • Adapter模式用来帮助无关的类协同工作,他通常在系统设计完成后才会被使用,而Bridge模式在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变

应用和思考

在这里插入图片描述

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

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

相关文章

gma 2 教程(二)数据操作:2. 功能逻辑架构和栅格数据类型简介

功能逻辑架构 gma栅格数据操作所含功能/属性的关系结构如下图所示: 栅格数据类型 gma栅格数据类型继承自GDAL,与NumPy数据关联,但又有所不同,详细关系见下表: 栅格格式支持 栅格格式信息统计 gma继承了GDAL全部的栅格…

详谈三次握手

作者:爱塔居 专栏:计算机网络 作者简介:大三学生,希望和大家一起进步 经过三次的对话,这两个火柴人才确认了双方都能够说话,都能听见。三次握手也是一样的,只要这样才能确认双方的接受与发送能力…

文件操作--按数据块读写文件

函数fread()和函数fwrite()用于一次读取一组数据,即按数据块读写文件。fread()的函数原型为: unsigned int fread(void *buffer ,unsigned int size,unsigned int count ,FILE *fp);…

raid5故障导致LeftHand存储崩溃的服务器数据恢复案例

HP-LeftHand存储简介: HP LeftHand存储支持RAID5、RAID6、RAID10磁盘阵列,支持卷快照,卷动态扩容等。 服务端: 客户端: LeftHand存储分为三个层级:物理磁盘、逻辑磁盘、逻辑卷。多个物理磁盘组成一个逻辑的…

pdf文档加水印怎么弄?用这款软件很方便

在工作中,我们经常需要将PDF文件发送给他人,但无法保证文件内容不被窃取,因此需要添加水印来保证文件的安全性。如果你不知道如何给PDF文件添加水印,以下两款软件可以帮助你轻松实现,一起来看看吧! 方法一&…

火爆全网,自动化测试-Allure完美测试报告(详全)卷起来...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、allure简介 A…

网络协议与攻击模拟-17-DNS协议-报文格式

二、DNS 查询 客户机想要访问www.baidu.com,根据自己的 TCP / IP 参数,向自己的首选 DNS 服务器发送 DNS 请求 首选 DNS 收到客户机的请求后,会去查询自己的区域文件,找不到www.baidu.com的 IP 地址信息(将请求转发到…

天池大赛中药说明书实体识别挑战冠军方案开源(二)部署运行实战 附详细操作说明

目录 Introduction 导言环境搭建环境 Github地址项目目录说明使用步骤下载预训练模型更改部分代码模型训练参数设置BERT-CRF模型训练BERT-SPAN模型训练BERT-MRC模型训练 运行训练预测复赛 test 文件 (上述模型训练完成后) 参考资料其它资料下载 Introduc…

Rdkit|化学指纹(fingerprint)

github:地址 文章目录 Rdkit|化学指纹(fingerprint)化学指纹(fingerprint)RDKFingerprintMorgan指纹提供的指纹信息存储在字典中 MACCS指纹AtomPair指纹TopologicalTorsion指纹参考 Rdkit|化学指纹(fingerprint&#x…

使用楔形步进体模进行X射线骨密度测定

来源:投稿 作者:洪棋 编辑:学姐 骨密度(BMD)被广泛应用于骨折风险的预测和骨质疏松症的常规识别。双能x线骨密度仪(DXA)在临床上广泛用于测量脊柱、髋关节和前臂的骨密度(aBMD)。放射学骨密度测定法(Radiographic absorpometry, RA)是最早的骨…

最全Linux Shell详细教程

一、环境准备 我们在这里就在本地测试学习,因此我在这里先不建议大家这么着急去买服务器来学,这样比较费钱,等我们学好这些基础之后,再去上手服务器,那将是手到擒来。 本地学习工具:虚拟机 如果你没有该工…

ES6~ES13新特性(一)

1 ECMA新描述概念 2 let、const的使用 3 let、const和var区别 4 块级作用域的使用 5 模板字符串的详解 6 ES6函数的增强用法 一个执行上下文关联两个环境。词法环境和变量环境。 词法环境是由let和const创建;变量环境是由var创建的。 let-const的基本使用、不能…

网络安全现状,一个黑客真实的收入

前言 上次带大家了解了什么是黑客,黑客是干嘛的,今天就来看看黑客的收入和方向怎么样。 一个黑客年薪是多少呢? 外界普遍认为黑客是高收入群体,那么你想过黑客是怎么赚钱的吗?黑客分为白帽黑客和黑帽黑客&#xff0…

R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题

本文介绍基于R语言中的UBL包,读取.csv格式的Excel表格文件,实现SMOTE算法与SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。 在之前的文章Python实现SMOGN算法解决不平衡数据的回归问题&#x…

源码安装 gcc遇到的问题

1、需要的工具和库的安装1 见https://gcc.gnu.org/install/preprequisites.hml 2、源码下载和依赖的工具的源码的下载 在https://gcc.gnu.org/mirrors.html中选择一个镜像源的链接打开,下边以日本的源(http://ftp.tsukuba.wide.ad.jp/software/gcc/)为例。 2.1 …

MySQL数据库的备份与还原、视图基础操作

一、备份与还原 1、使用mysqldump命令备份数据库中的所有表 mysqldump -uroot -p#$%#*#^* booksDB authorbook authors books > /backup/db/booksDB.spl 2、备份booksDB数据库中的books表 mysqldump -uroot -p*&*&……%¥#¥% booksDB books …

FreeRTOS(任务调度)

任务调度 什么是任务调度? 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。 FreeRTOS中开启任务调度的函数是 vTaskStartScheduler() ,但在 CubeMX 中被封装为 osKernelStart() 。 FreeRTOS的任务调度规则是怎样的? FreeRTOS…

QT禁用窗口【关闭】按钮的实现方法

QT禁用窗口关闭按钮的实现方法,直接在窗体类构造函数的内部写入setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint)即可实现,案例如下: #include "form.h" #include "…

apache 安装配置 基础篇(三) 之 虚拟机、主服务等、默认虚拟主机、serverpath、DocumentRoot Directory

apache虚拟主机类型有两种 1、基于名称的虚拟主机 2、基于地址或IP地址的虚拟主机 基于名称的虚拟主机 但是如果不用域名(host)就没有办法区分了,而执行第一个匹配的网站了(第一个虚拟主机所处理) ## httpd-vhosts.conf 添加如下代码&…

选择合适的软件,提升工作计划效率

在快节奏的工作环境中,日程安排变得尤为重要。有许多不同的软件可用于帮助管理日程,但哪个软件最适合您的需求?在本文中,我们将介绍几种适合工作安排的软件。 1.Google Calendar Google日历是一种功能强大、易于使用且免费的日历应…