7、设计模式之桥接模式(Bridge)

news/2024/7/27 11:53:20/文章来源:https://blog.csdn.net/weixin_45817985/article/details/136651032

一、什么是桥接模式
桥接模式是一种结构型设计模式。它将抽象部分和实现部分分离,使它们可以独立地变化。

二、角色组成
抽象部分(Abstraction):定义了抽象部分的接口,并包含对实现部分的引用。
实现部分(Implementor):定义了实现部分的接口。
具体抽象(Concrete Abstraction):继承抽象部分,实现其中定义的抽象方法。
具体实现(Concrete Implementor):实现Implementor,实现其中定义的具体行为。
三、优缺点
优点:

分离抽象和实现,使得它们可以独立变化。
提高了系统的灵活性和可扩展性。
隐藏了具体的实现细节,使系统更加稳定和可靠。
符合开闭原则,可以方便地增加新的抽象和实现部分。
缺点:

需要定义抽象部分和实现部分之间的桥接接口,增加了系统的复杂性。
如果一个类有多个变化的维度,使用桥接模式可能会导致类的数量增多,增加了系统的复杂性和维护成本。
四、应用场景
4.1 生活场景
墙上的开关:可以看到的开关是抽象的,不用管里面具体怎么实现的。
蓝牙耳机与手机:蓝牙耳机可以连接不同品牌的手机,那么手机就可以看作是抽象部分,蓝牙耳机是实现部分,实现不同蓝牙耳机与不同手机的连接和通讯。
遥控器和电视:同样道理,遥控器可以控制不同品牌的电视,遥控器可以作为抽象部分,电视则作为实现部分,实现不同遥控器与不同电视的连接和操作。
4.2 java场景

JdbcTemplate:用于简化数据库操作的类,它使用了桥接模式将数据库的访问方式(如JDBC、Hibernate、MyBatis)与具体的实现(Oracle、Mysql、SQL
Server)分离,这样可以方便地切换不同的数据库访问方式。
Spring的DI和IOC:抽象部分定义了接口或抽象类。比如BeanFactory,而实现部分则由具体的实现类(XmlBeanFactory等)提供。
日志框架:抽象部分定义了一组日志记录接口,并提供了不通过的日志记录方法,如DEBUG、INFO、ERROR等,实现部分则通过具体的日志实现类提供实际的日志记录功能,如Log4j、Logback等。

五、代码实现
下面是一个蓝牙耳机和手机的简单例子,用来解释桥接模式。手机作为抽象部分,蓝牙耳机作为实现部分。通过抽象类对实现类接口的引用,使手机可以调用蓝牙接口的方法,实现手机与蓝牙耳机的连接和调用的解耦。

抽象部分:Phone
实现部分:Bluetooth
具体抽象:HWPhone、IPhone
具体实现:BluetoothImpl

5.0 UML类图
在这里插入图片描述
5.1 实现部分——Bluetooth

/**** 1.实现部分(Implementor):蓝牙接口*/
public interface Bluetooth {//连接void connect();//断开void disConnect();
}

5.2 具体实现——BluetoothImpl

/*** * 2.具体实现(Concrete Implementor):实现蓝牙接口*/
public class BluetoothImpl implements Bluetooth{@Overridepublic void connect() {System.out.println("蓝牙已连接!");}@Overridepublic void disConnect() {System.out.println("蓝牙已断开!");}
}

5.3 抽象部分——Phone

/*** * 3.抽象部分(Abstraction):手机抽象类*/
public abstract class Phone {//蓝牙接口实例protected Bluetooth bluetooth;public Phone(Bluetooth bluetooth){this.bluetooth=bluetooth;}//手机具体功能,调用蓝牙接口的方法public abstract void bluetoothFunction();
}

5.4 具体抽象

/*** * 4.具体抽象:苹果手机*/
public class IPhone extends Phone{public IPhone(Bluetooth bluetooth) {super(bluetooth);}//手机具体功能,调用蓝牙@Overridepublic void bluetoothFunction() {System.out.println("苹果手机使用蓝牙耳机");bluetooth.connect();bluetooth.disConnect();}
}
/*** * 4.具体抽象:华为手机*/
public class HWPhone extends Phone{public HWPhone(Bluetooth bluetooth) {super(bluetooth);}//手机具体功能,调用蓝牙@Overridepublic void bluetoothFunction() {System.out.println("华为手机使用蓝牙耳机");bluetooth.connect();bluetooth.disConnect();}
}

5.5 TestBridge

/*** * 桥接模式测试类*/
@SpringBootTest
public class TestBridge {@Testvoid testBridge(){//1 创建蓝牙耳机对象Bluetooth bluetooth=new BluetoothImpl();//2.创建不同品牌的手机对象//苹果Phone iPhone=new IPhone(bluetooth);//华为Phone hw=new HWPhone(bluetooth);//调用手机的具体功能方法iPhone.bluetoothFunction();System.out.println("=========================");hw.bluetoothFunction();}
}

六、总结
当一个类需要两个或多个变化维度时:桥接模式可以将这些变化维度分离出来,使它们可以独立变化。例如,在一个图形编辑器中,图形和颜色可以被视为两个变化的维度,通过使用桥接模式,可以实现不同图形和不同颜色的组合。
当需要实现多层继承时:使用继承会导致类层次结构的爆炸性增长,难以维护和扩展。而桥接模式通过将抽象部分和实现部分分离,使得新增功能可以通过组合来实现,而不是通过继承。
当需要在抽象部分和实现部分之间增加灵活性时:桥接模式允许抽象部分和实现部分可以独立变化,提供了更大的灵活性和可配置性。例如,在一个电商平台中,抽象部分可以是商品,实现部分可以是支付方式,通过桥接模式可以在运行时选择不同的支付方式。
当需要对抽象和实现部分进行扩展时:桥接模式允许抽象部分和实现部分可以独立扩展,而不会相互影响。例如,在一个电子设备管理系统中,抽象部分可以是设备接口,实现部分可以是不同类型的设备,通过桥接模式可以方便地添加新的设备类型。
总结:桥接模式适用于多维度变化、多层继承、灵活性要求高、扩展性高的场景。

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

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

相关文章

WordPress建站入门教程:如何创建菜单和设置前端导航菜单?

前面我们跟大家分享了WordPress如何上传安装WordPress主题,但是启用主题后前端没有看到有导航菜单,这是因为我们还没有创建菜单和设置导航菜单。 JianYue主题导航菜单和右上角菜单 今天boke112百科就继续跟大家分享WordPress站点如何创建菜单和设置前端…

day36 贪心算法part5

435. 无重叠区间 中等 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 气球问题稍加改动就可ac 一个交叉区间里,最终只能保留一个,其他的全部要去掉。…

欧科云链:角力Web3.0,香港如何为合规设线?

在香港拥抱Web3.0的过程中,以欧科云链为代表的合规科技企业将凸显更大重要性。 ——据香港商报网报道 据香港明报、商报等媒体报道,港区全国政协兼香港选委界立法会议员吴杰庄在日前召开的全国两会上提出在大湾区建设国际中小企业创新Web3融资平台等提案&#xff0…

Solidity攻击合约:重入攻击与危害分析

以太坊智能合约开发中,重入攻击是一种常见的安全漏洞。这种攻击通常发生在合约的递归调用中,攻击者通过构造恶意交易,使得原本合约在执行过程中不断调用自身或其他合约,从而耗尽合约的Gas(交易费用)&#x…

STM32(18)I2C

串口通信缺点 一个设备就需要一个串口,单片机可能没有那么多串口外设 总线/非总线 主机:负责管理总线,可控制波特率、数据的通信方向 波特率:由主机产生波特率信号 数据的传输 每个从机都有7位地址,最后移位是读&a…

django学习记录07——订单案例(复选框+ajax请求)

1.订单的数据表 1.1 数据表结构 1.2 数据表的创建 models.py class Order(models.Model):"""订单号"""oid models.CharField(max_length64, verbose_name"订单号")title models.CharField(max_length64, verbose_name"名称&…

Hack The Box-Codify

目录 信息收集 rustscan nmap dirsearch WEB 提权 get user get root 信息收集 rustscan ┌──(root㉿ru)-[~/kali/hackthebox] └─# rustscan -b 2250 10.10.11.239 --range0-65535 --ulimit4500 -- -A -sC .----. .-. .-. .----..---. .----. .---. .--. .-. …

Long-term Correlation Tracking LCT 目标跟踪算法源码运行

资源 LCT-tracker项目地址VLFeat官网OpenCV下载地址OTB50数据集百度网盘资源 参考博客 一步一步教你跑lct-tracker(Win10Matlab 2016bVisual Studio 2015)LCT代码跑起来先文章思路总结 正文 1. 环境配置 我的环境:Win11、Visual Studio…

LF253DT运算放大器芯片中文资料规格书PDF数据手册引脚图图片参数价格功能

产品概述: 这些电路是高速JFET输入双运算放大器,在单片集成电路中集成了匹配良好的高压JFET和双极晶体管。 这些器件具有高转换速率、低输入偏置和失调电流以及低失调电压温度系数。 产品功能: 无闩锁操作内部频率补偿低功耗低输入偏置和…

JS数组相关知识

获取数组的最大值/最小值&#xff1a; let arrary [2,5,4] let max arrary[0] for(let i 0;i<arrary.length;i){if(arrary[i]>max){max arrary[i]} }console.log(max);//查询数组最小值let arr [2,21,34,23,45] let min arr[0] for(let i 0;i<arr.length;i){if…

24考研调剂 | 武汉纺织大学

教育部重点实验室招收24年调剂生&#xff0c;材料、化学、机械工程、计算机、力学等相关专业 考研调剂招生信息 学校:武汉纺织大学 专业:工学->材料科学与工程 年级:2024 招生人数:100 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看)…

JavaEE:网络编程

网络编程&#xff1a;通过代码完成基于网络的跨主机通信 跨主机通信方式&#xff1a; 1.TCP/IP网络 2.蓝牙通信 3.近场通信NFC 4.毫米波通信&#xff1a;功率高&#xff0c;带宽高&#xff0c;抗干扰能力差 其中TCP/IP网络是日常编程中最常涉及到的&#xff0c;最通用的跨主机通…

吴恩达机器学习-可选实验:使用ScikitLearn进行线性回归(Linear Regression using Scikit-Learn)

文章目录 实验一目标工具梯度下降加载数据集缩放/规范化训练数据创建并拟合回归模型查看参数作出预测绘制结果 恭喜 实验二目标工具线性回归&#xff0c;闭式解加载数据集创建并拟合模型查看参数作出预测 第二个例子恭喜 有一个开源的、商业上可用的机器学习工具包&#xff0c;…

day42 动态规划part4

先遍历物品还是先遍历背包二刷再考虑吧。累了&#xff0c;不想停留太久。 背包问题 二维 &#xff08;卡码网题目&#xff09; 各种解释&#xff1a; 要理解的是这个表格每一个格子都是当前所处情况的最大价值&#xff0c;我们用已经推导出的最大价值来推导当前情况的最大价值…

用chatgpt写论文重复率高吗?如何降低重复率?

ChatGPT写的论文重复率很低 ChatGPT写作是基于已有的语料库和文献进行训练的&#xff0c;因此在写作过程中会不可避免地引用或借鉴已有的研究成果和观点。同时&#xff0c;由于ChatGPT的表述方式和写作风格与人类存在一定的差异&#xff0c;也可能会导致论文与其他文章相似度高…

LiveGBS流媒体服务器中海康摄像头GB28181公网语音对讲、语音喊话的配置

LiveGBS海康摄像头国标语音对讲大华摄像头国标语音对讲GB28181语音对讲需要的设备及服务准备 1、背景2、准备2.1、服务端必备条件&#xff08;注意&#xff09;2.2、准备语音对讲设备2.2.1、不支持跨网对讲示例2.2.2、 支持跨网对讲示例 3、开启音频开始对讲4、搭建GB28181视频…

Linux学习笔记(一)Linux基本指令

文章目录 前言目录常见命令1. pwd 打印当前所在路径2. cd 改变路径、切换路径3. 家目录 回到顶级目录4. 当前路径和上一路径5. 上一次路径6. 绝对路径和相对路径7. ls 列出目录内容8. mkdir 创建目录9. rmdir 删除目录10. touch 创建文件11. mv 修改文件目录、移动路径12. cp 复…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RemoteWindow)

远程控制窗口组件&#xff0c;可以通过此组件控制应用窗口&#xff0c;提供启动退出过程中控件动画和应用窗口联动动画的能力。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件为系统接口。…

【Axure高保真原型】下拉列表切换图表

今天和大家分享通过下拉列表动态切换统计图表的原型模板&#xff0c;我们可以通过下拉列表选择要显示的图表&#xff0c;包括柱状图、条形图、饼图、环形图、折线图、曲线图、面积图、阶梯图、雷达图&#xff1b;而且图表数据可以在左侧表格中动态维护&#xff0c;包括增加修改…

基于php的用户登录实现(v2版)(持续迭代)

目录 版本说明 数据库连接 登录页面&#xff1a;login.html 登录处理实现&#xff1a;login.php 用户欢迎页面&#xff1a;welcome.php 密码修改页面&#xff1a;change_password.html 修改执行&#xff1a;change_password.php 用户注册页面&#xff1a;register.html …