Java设计模式之 -- 桥接模式
什么是桥接模式
桥接模式是一种结构型设计模式,也被称为“Handle/Body”。这种设计模式主要用于将抽象部分与它的实现部分分离,使它们可以独立地变化。这种方式有助于减少系统中的耦合性,增加了扩展性。
主要解决什么问题
桥接模式主要解决的是类的维度扩展问题。在一个多维度变化的类中,使用继承方式会导致类的数量急剧增加,而且增加新的维度也相对困难。而桥接模式能够将类的各个维度进行分离,独立扩展,降低类之间的耦合度。
在什么时候我们需要使用桥接模式
当你想要避免永久性地绑定某个抽象类与其实现时。
当类的抽象和实现都应该可以通过生成子类来扩展时。
当一个类的变化应该不依赖于它的实现变化,两者可以独立变化时。
生活中的应用实例
想象一下,你正在设计一个跨平台的视频播放器,支持Windows、Linux、Mac等多个操作系统,同时需要支持多种不同的视频格式,如MP4、AVI、MOV等。
如果使用继承来设计,那么需要为每个操作系统和视频格式的组合创建一个子类(例如:WindowsMP4Player、LinuxAVIPlayer等)。随着支持的操作系统和视频格式的增加,子类的数量会急剧增加。
如果采用桥接模式,可以将操作系统(抽象化)和视频格式(实现化)分离开来,分别扩展。这样只需要创建对应操作系统和视频格式的类,通过组合就可以得到我们想要的功能,大大减少了类的数量。
优点
分离抽象接口及其实现部分。
提高了系统的可扩展性,在两个方向上都可以独立扩展。
实现细节对客户透明,可以对用户隐藏实现细节。
缺点
增加了系统的理解和设计难度,需要理解如何分离抽象和实现。
需要正确识别出系统中两个独立变化的维度。
使用场景
当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
当你希望在不影响客户端代码的情况下隐藏抽象的实现细节时。
代码示例
// 抽象化角色:颜色
interface Color {void bepaint(String shape);
}// 实现化角色:红色
class RedColor implements Color {public void bepaint(String shape){System.out.println("红色的" + shape);}
}// 实现化角色:蓝色
class BlueColor implements Color {public void bepaint(String shape){System.out.println("蓝色的" + shape);}
}// 抽象化角色:形状
abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}public abstract void draw();
}// 扩充抽象化角色:圆形
class Circle extends Shape {public Circle(Color color) {super(color);}public void draw() {color.bepaint("圆形");}
}// 扩充抽象化角色:正方形
class Square extends Shape {public Square(Color color) {super(color);}public void draw() {color.bepaint("正方形");}
}public class Client {public static void main(String[] args) {Color red = new RedColor();Shape square = new Square(red);square.draw();Color blue = new BlueColor();Shape circle = new Circle(blue);circle.draw();}
}
在这个示例中,Color 是实现化角色,RedColor 和 BlueColor 是具体实现化角色;Shape 是抽象化角色,Square 和 Circle 是扩充抽象化角色。Shape 中包含了一个 Color 的引用,形成了桥接。
当我们运行 main 方法,就可以看到输出 “红色的正方形” 和 “蓝色的圆形”。
相关文章:
Java设计模式之 -- 桥接模式
什么是桥接模式 桥接模式是一种结构型设计模式,也被称为“Handle/Body”。这种设计模式主要用于将抽象部分与它的实现部分分离,使它们可以独立地变化。这种方式有助于减少系统中的耦合性,增加了扩展性。 主要解决什么问题 桥接模式主要解决…...
【node.js】02-path模块
目录 1. path.join() 2. path.basename() 3. path.extname() 1. path.join() 使用 path.join() 方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下: path.join([...paths]) 例子: const path require(path)co…...
攻防世界-Reverse-re1
题目描述:菜鸡开始学习逆向工程,首先是最简单的题目 下载附件,执行程序,如下界面 1. 思路分析 没啥说的,既然题目都说是一道简单的逆向题,那么直接使用ida逆向即可,看逆向出的结果是否能写入到…...
AES加密的基本常识和封装类
AES加密的基本常识和封装类 AES(Advanced Encryption Standard)是一种对称密钥加密算法,被广泛用于保护敏感数据的安全性。它是一种块加密算法,意味着它将明文数据分成固定大小的块,并使用相同的密钥对每个块进行独立…...
elasticsearch使用记录
参考文章:https://elasticsearch-py.readthedocs.io/en/v8.8.2/ 参考文章:https://cuiqingcai.com/6214.html 参考文章:https://www.cnblogs.com/cupleo/p/13953890.html elasticsearch版本:8.8.2(软件包发行版) python版本&#…...
UNI-APP_横屏切换竖屏出现样式混乱问题
app从竖屏页面1进入竖屏页面2,再进入横屏,再返回,再返回从新回到竖屏页面1,再次进入竖屏页面2,发现竖屏页面2的所有图片字体都被放大了。再返回竖屏1,再进入竖屏2,一切又恢复正常。 解决跳转横…...
数据可视化(3)
1.饼状图 #饼状图 #pie(x,labels,colors,labeldistance,autopct,startangle,radius,center,textprops) #x,每一块饼状图的比例 #labels:每一块饼形图外侧显示的文字说明 #labeldistance:标记的绘制位置,相对于半径的比例…...
AI面试官:MD5、DES、RSA、AES加密
AI面试官:MD5、DES、RSA、AES加密 文章目录 AI面试官:MD5、DES、RSA、AES加密1. 什么是MD5加密?它在实际应用中有哪些场景?2. DES加密是什么?它在现实中的应用场景有哪些?3. 问题:RSA加密是什么…...
Shell脚本学习-$$特殊变量
$$特殊变量: 获取脚本执行的进程号(PID)。 [rootvm1 scripts]# cat test_pid.sh echo $$ > /tmp/a.pid sleep 300代码说明: 1)获取$$值,也就是当前脚本进程的PID值,重定向到/tmp/a.pid文件…...
vscode中python插件过新导致无法正常debug问题解决安装vscode以前版本python插件教程
您需要从.vsix文件安装它。您可以在此处找到它们。 下载所需.vsix版本的文件。您可能需要单击assets才能看到它们。 然后打开 VSCode,转到extensions-> 单击三个点 ->install from vsix并选择您的文件。 重启以后,就可以正常debug了!...
chrome macos编译
下载工具包 git clone https://chromium.googlesource.com/chromium/tools/depot_tools/gitpwd export PATH"$PATH:/Users/lichengjun/Downloads/chrome_build/depot_tools" mkdir chromium cd chromium 如果想快的话直接: fetch --nohooks --no-history chromium (…...
Linux环境下Elasticsearch相关软件安装
Linux环境下Elasticsearch相关软件安装 本文将介绍在linux(Centos7)环境下安装Elasticsearch相关的软件。 1、安装Elasticsearch 1.1 Elasticsearch下载 首先去Elasticsearch官网下载相应版本的安装包,下载之后传输到linux服务器上。 官网地址:http…...
【趟坑记录】d3.zoom()的正确使用姿势 @d3.v7
【趟坑记录】d3.zoom()的正确使用姿势 d3.v7 文章目录 【趟坑记录】d3.zoom()的正确使用姿势 d3.v7问题重现原因分析解决方案放缩平移写法特殊修改transform函数的写法 总结 在开发一个D3应用的时候遇到了一个 zoom相关的问题,记录解决思路与方案 问题重现 最近在…...
基于 Docker + Nginx + Gitlab-runner 实现前端自动化部署流程
本篇会用到Docker,Gitlab-runner等相关工具,如果对其不是特别了解,可以参考下相关文档: GitLab RunnerDocker 快速入门CI/CD:持续集成/持续部署 在早期部署前端项目时,我们通常会通过ftp把前端代码直接传…...
make/makefile的使用
make/makefile 文章目录 make/makefile初步认识makefile的工作流程依赖关系和依赖方法make的使用 总结 make是一个命令,是一个解释makefile中指令的命令工具,makefile是一个文件,当前目录下的文件,两者搭配使用,完成项…...
Flutter中Navigator 跳转传参数和反向传参数
初始化路由 MaterialApp(routes: <String, WidgetBuilder>{"/Second": (BuildContext context){return Second("");}}, 跳转传参数 String va await Navigator.of(context).push(MaterialPageRoute(builder: (content) {return Second( demo); },…...
kettle开发-Day40-AI分流之case/switch
前言: 前面我们讲到了很多关于数据流的AI方面的介绍,包括自定义组件和算力提升这块的,今天我们来学习一个关于kettle数据分流处理非常重要的组件Switch / Case 。当我们的数据来源于类似日志、csv文件等半结构化数据时,我们需要在…...
MySQL下载与安装
MySQL下载与安装 一、下载 地址:https://dev.mysql.com/downloads/mysql/ 当前最新是8.0版本,我选择上一个最新的mysql-5.7.24-winx64.zip 二、安装 MySQL安装文件分两种 .msi和.zip ,.msi需要安装 zip格式是自己解压,解压缩之后…...
c++基础2
文件操作 程序运行时产生的数据属于临时数据,程序一旦运行结束都会被释放 通过文件可以将数据持久化 c中对文件操作需要包含 文件类型分为两种 文本文件:文件以ASCII码形式存储在计算机中二进制文件:文件以文本的二进制存储在计算机中&a…...
虚拟机VMware,linux,centos,如何将项目部署到服务器上面
vmware 是安装虚拟机的软件,centos是系统,linux是系统内核 将本地项目上线到服务器上面,如何实现呢? 准备好服务器,可以选择阿里云服务器 首先需要搭建环境,运行的主要环境是jdktomcatmysql; 通过远程连接…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
