(九)趣学设计模式 之 桥接模式!
目录
- 一、 啥是桥接模式?
- 二、 为什么要用桥接模式?
- 三、 桥接模式的实现方式
- 四、 桥接模式的优缺点
- 五、 桥接模式的应用场景
- 六、 总结
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解装饰器模式请看: (八)趣学设计模式 之 装饰器模式!
这篇文章带你详细认识一下设计模式中的桥接模式
一、 啥是桥接模式?
想象一下,你想要画不同形状的图形 🎨 (比如:圆形、矩形),并且你想用不同的颜色来填充这些图形 🖍️ (比如:红色、蓝色)。 你希望你的程序能够支持所有形状的图形用所有颜色来填充,而且以后还可以方便地添加新的形状和新的颜色 ➕。
桥接模式,就是将抽象部分与实现部分分离,使它们都可以独立地变化! 它可以让你在不修改原有代码的基础上,扩展抽象部分和实现部分的功能 ➕。
简单来说,就是把两个变化维度分开,让他们各自独立发展! ↔️
- 你有两个或多个独立的维度需要变化: 就像图形的形状和图形的颜色是两个独立的维度 🎨🖍️!
- 你想避免类爆炸: 就像你不想为每种形状和颜色的组合都创建一个新的类 🔴圆形, 🟦矩形!
- 你想让抽象部分和实现部分可以独立地扩展: 就像你想方便地添加新的图形形状和新的颜色 ➕!
二、 为什么要用桥接模式?
用桥接模式,好处多多 👍:
- 分离抽象和实现: 将抽象部分和实现部分分离,降低耦合度 🔗!
- 扩展性好: 可以独立地扩展抽象部分和实现部分的功能 ➕!
- 灵活性高: 可以动态地组合不同的抽象部分和实现部分,实现不同的功能组合 🤸!
- 避免了类爆炸问题: 不需要创建大量的子类,减少了类的数量 💥!
三、 桥接模式的实现方式
桥接模式主要包含以下几个角色:
- Abstraction(抽象类): 定义抽象类的接口,维护一个指向Implementor类型对象的引用。 🎨 (比如:图形)
- RefinedAbstraction(细化抽象类): 扩展抽象类定义的接口。 🎨 (比如:带边框的图形)
- Implementor(实现类接口): 定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同。 通常Implementor接口提供基本操作,而Abstraction接口提供基于这些基本操作的较高层次的操作。 🖍️ (比如:颜色)
- ConcreteImplementor(具体实现类): 实现Implementor接口并定义它的具体实现。 🖍️ (比如:红色、蓝色)
代码示例:
// 实现类接口:颜色
public interface Color {String fill(); // 填充颜色
}// 具体实现类:红色
public class Red implements Color {@Overridepublic String fill() {return "红色";}
}// 具体实现类:蓝色
public class Blue implements Color {@Overridepublic String fill() {return "蓝色";}
}// 抽象类:图形
public abstract class Shape {protected Color color; // 组合颜色对象public Shape(Color color) {this.color = color;}public abstract String draw(); // 绘制图形
}// 细化抽象类:圆形
public class Circle extends Shape {public Circle(Color color) {super(color);}@Overridepublic String draw() {return "绘制圆形,填充" + color.fill();}
}// 细化抽象类:矩形
public class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridepublic String draw() {return "绘制矩形,填充" + color.fill();}
}// 客户端
public class Client {public static void main(String[] args) {Color red = new Red(); // 创建红色对象Shape circle = new Circle(red); // 创建红色圆形对象System.out.println(circle.draw()); // 绘制红色圆形Color blue = new Blue(); // 创建蓝色对象Shape rectangle = new Rectangle(blue); // 创建蓝色矩形对象System.out.println(rectangle.draw()); // 绘制蓝色矩形}
}
分析:
Color
是实现类接口,定义了颜色的填充方法。Red
和Blue
是具体实现类,分别实现了红色和蓝色。Shape
是抽象类,组合了颜色对象,并定义了绘制图形的方法。Circle
和Rectangle
是细化抽象类,分别实现了圆形和矩形。
输出结果:
绘制圆形,填充红色
绘制矩形,填充蓝色
四、 桥接模式的优缺点
优点:
- 分离抽象和实现 🔗!
- 扩展性好 ➕!
- 灵活性高 🤸!
- 避免了类爆炸问题 💥!
缺点:
- 增加了系统的复杂度 😫!
- 需要识别出两个独立的维度,设计难度较高 🧠!
五、 桥接模式的应用场景
- 当一个类存在两个或多个独立变化的维度,且这两个维度都需要扩展时: 就像图形的形状和图形的颜色 🎨🖍️!
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时: 就像需要动态地组合不同的图形和颜色 🎨🖍️!
- 避免类爆炸: 就像避免为每种形状和颜色的组合都创建一个新的类 🔴圆形, 🟦矩形!
- 跨平台GUI库: 不同的操作系统有不同的GUI实现,桥接模式可以将GUI的抽象接口与具体的操作系统实现分离。
六、 总结
- 桥接模式就像把两个变化维度分开,让他们各自独立发展! ↔️
- 主要包含抽象类、细化抽象类、实现类接口和具体实现类四个角色! 🎭
- 优点是分离抽象和实现、扩展性好、灵活性高、避免类爆炸! 👍
- 缺点是增加复杂度、设计难度较高! 👎
- 适用于存在两个或多个独立变化的维度,且这两个维度都需要扩展的场景! 🎯
希望这篇文章能让你更容易理解桥接模式! 💯 祝你学习愉快! 😄
看完请看:(十)趣学设计模式 之 外观模式!
相关文章:
(九)趣学设计模式 之 桥接模式!
目录 一、 啥是桥接模式?二、 为什么要用桥接模式?三、 桥接模式的实现方式四、 桥接模式的优缺点五、 桥接模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...
Web Worker 使用教程
一、概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带…...
算法仿真平台搭建1-FFMPEG+RtspSever快速搭建一个RTSP服务器
一、前言 本文相关的全部源码和RtspSever库,我已打包上传,欢迎大家免费下载,testRTSPSever。 每一个嵌入式视觉算法工程师,都应该有一套属于自己的算法仿真和测试环境。可以方便地进行视频、图像等素材进行在线导入,可…...
网络安全审计员
在当今数字化时代,随着信息技术的迅猛发展,网络安全问题日益凸显,成为各行各业不容忽视的重要议题。特别是对于企业、政府机构等组织而言,网络安全不仅关乎数据资产的安全,更与组织的声誉、客户信任乃至法律法规的遵从…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(7)
7.3. 查询计划相关操作符 58)Nested Loops:该操作符执行Inner Join,Left Outer Join,Left Semi Join,以及Left Anti Semi Join等逻辑操作。该操作符用其外(上面)输入中的每行数据对其内(下面)输入进行一个搜索,典型场景为其使用一个索引。查询处理器基于预期的成本决…...
数据库测试
TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较:TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化:如何提升数据库查询速度,揭秘实战技巧与挑战 引言 T…...
数据结构——排序4
上次我们讲解了快速排序的递归的几种做法。 那么,作为一名合格的程序员,改递归为非递归是必要的,现在我们来学习一下非递归的做法: 快速排序非递归: 首先,我们先了解一下,为什么要改为非递归…...
Pycharm中怎么加快下载三方包速度
Pycharm中怎么加快下载三方包速度 使用命令行下载,-i pip install transformers -i https://mirrors.aliyun.com/pypi/simple/ 在Windows系统的PyCharm中使用Python 3.12环境时,可通过以下几种方式配置不同镜像源来加快下载包的速度。 方式一:在PyCharm界面中直接配置镜…...
Spring MVC框架二:创建第一个MVC程序
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 有两种方式 利用配置 1、利用IDEA新建一个Maven项目,添加一个web支持 2、导入常用的依赖 <dependencies><dependency><groupId…...
Netty为什么性能很高?
大家好,我是锋哥。今天分享关于【Netty为什么性能很高?】面试题。希望对大家有帮助; Netty为什么性能很高? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty是一款高性能的网络通信框架,主要用于构建高性能的网络应用程序。…...
目标检测tricks
A. Stochastic Weight Averaging (SWA) 1. 基本思想 SWA 的核心思想是通过对训练过程中不同时间点的模型参数进行加权平均,从而获得一个更好的模型。具体来说,SWA 在训练过程的后期阶段对多个不同的模型快照(snapshots)进行平均…...
ai-2、机器学习之线性回归
机器学习之线性回归 1、机器学习2、线性回归2.1、梯度下降法 3、python下调用scikit-learn 1、机器学习 2、线性回归 ####所以y可以当成我们需要的结果,根据公式可以求的y一撇的值更小,所以更接近需要的结果,所以y一撇拟合性更好 2.1、梯度下…...
版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点
版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点 引言正文定义坐标点的类绘图显示代码直接连接两个坐标点引言 由于人工智能的加速普及,每次手动绘制版图都会觉得特别繁琐,作者本人在想可否搞一个自动化连接器件端口的算法,后期可以根据一些设定的限制进行避…...
删除变慢问题
问题: 有一个场景,每天都会删除数据,SQL为delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 ,一直循环执行,当执行到最后一次满足条件的时候,就会很慢 原理分析 索引与…...
第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子
编程实现: 小猫照镜子。(背景非源素材) 具体要求: 1). 运行程序,角色、背景如图所示; 完整题目可点击下方链接查看,支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…...
Python标准库【os.path】操作路径
文章目录 1 该模块的源文件2 提取路径信息3 获取文件信息4 判定路径状态5 变换路径6 路径拆分 os.path模块实现了一些操作路径相关的函数。它们都接收字符串、字节串格式的路径或类路径对象(实现os.PathLike协议)为参数。 接收字符串时,函数返回的结果也是字符串&am…...
vue3 keep-alive 页面切换不触发onActivated和onDeactivated方法周期
<script setup lang"ts"> import { onActivated, onDeactivated, shallowRef } from vue import CompA from ../components/CompA.vue import CompB from ../components/CompB.vue const current shallowRef(CompA) onActivated(() > {console.log(组件被激…...
Qt 中集成mqtt协议
一,引入qmqtt 库 我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台时 方便,直接编译就行了。 原始仓库路径:https://github.com/emqx/qmqtt/tree/master 二,使用 声明一个单例类,将订阅到…...
JAVA面试_进阶部分_23种设计模式总结
1. 单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这 个实例。 (1)懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载…...
初阶数据结构(C语言实现)——3顺序表和链表(3)
3.链表 3.1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的物理结构 1.从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续…...
Vue打包(webpack)缓存
解决方法: 1、修改vue.config.js文件 const Timestamp new Date().getTime();module.exports defineConfig({configureWebpack{output: {filename: [name].${Timestamp}.js,chunkFilename: [name].${Timestamp}.js},},css: {extract: { // 打包后css文件名称添加…...
磁盘阵列新秀GSx并行文件存储是HPC高性能计算/AI 大模型-1替3好省预算
Infortrend 普安存储GSx 并行文件存储系统凭一体化设计,颠覆了传统存储系统的复杂配置模式。内置并行文件系统,支持私有协议或 CIFS 协议,实现客户端/服务器与存储设备的直接连接,无需额外配置I/O节点、元数据服务器及并行系统软件࿰…...
数据基础4: 线性代数基础行列式(矩阵)
二阶 三阶 矩阵和数据之间的关系。 行列式 n,n ;矩阵m行,n列 逆序数 在行列式的计算中,逆序数用于决定每一项前面的符号。 如果一个排列的逆序数是偶数,则该项前面的符号为正; 如果是奇数,则符号为负。 …...
【Project】基于Prometheus监控docker平台
一、设计背景 1.1项目简介 本项目旨在创建一个全面的容器化应用程序监控解决方案,基于Prometheus监控Docker平台上的各种服务。在当今的软件开发环境中,容器化技术已成为一种关键的工具,使应用程序能够更快速、可靠地交付和扩展。然而&…...
AcWing 蓝桥杯集训·每日一题2025·密接牛追踪2
密接牛追踪2 农夫约翰有 N 头奶牛排成一排,从左到右依次编号为 1∼N。 不幸的是,有一种传染病正在蔓延。 最开始时,只有一部分奶牛受到感染。 每经过一个晚上,受感染的牛就会将病毒传染给它左右两侧的牛(如果有的话…...
面试(进阶) —虚拟列表在什么场景使用,如何实现?
面试(进阶) —虚拟列表在什么场景使用,如何实现? 在前端开发中,当需要渲染大量数据时,传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中,不仅会导致页面加载缓慢,还可能占用大量内存&#x…...
Linux基础 -- ARM 32位常用机器码(指令)整理
ARM 32位常用机器码(指令)整理 1. 数据处理指令(运算、逻辑、比较) 指令含义示例备注MOV赋值(寄存器传输)MOV R0, R1直接将 R1 复制到 R0MVN取反MVN R0, R1R0 ~R1ADD加法ADD R0, R1, R2R0 R1 R2ADC带进…...
【JAVA】阿里云百炼平台对接DeepSeek-V3大模型使用详解
1、DeepSeek简介 DeepSeek的火热让全世界见证了一场国产AI大模型走向巅峰的盛宴。DeepSeek的横空出世一方面让AI大模型的格局得到重塑,另一方面,对于普通人来说,也有机会零距离的体验到更懂国人的AI大模型。从很多使用过后的小伙伴们的反馈来…...
STM32之时钟树
左边是时钟产生电路,右边是时钟分配电路。中间的SYSCLK就是系统时钟72MHz,在产生电路有四个时钟源,分别是内部8MHz高速RC振荡器,外部的4-16MHz高速石英晶体振荡器,这个一般接8MHz,第三个是外部的32.768kHz低速晶振&…...
QT day1
作业 代码 class Widget: public QWidget {QPushButton* button; //按钮Widget* other; //显示对面 public:Widget(){button new QPushButton("按钮",this); //控件 认this作父this->resize(300,300); //界面大小button->resize(100,10…...
【机器学习】梯度下降法及使用一元二次方程模拟使用梯度下降法的代码实现
梯度下降法 一、摘要二、梯度下降法三、线性方程中使用梯度下降法 一、摘要 文本主要讲述了梯度下降法作为机器学习中的一种优化方法,用于最小化损失函数。它并非直接解决机器学习问题,而是作为求解最优参数的工具。通过二维坐标图直观展示了梯度下降法…...
Hive配置
目录 1. 引言2. 通过docker-compose联动启动Hadoop和MySQL容器3. 配置Hive3.1 下载并解压Hive-4.0.12.2 配置环境变量2.3 安装mysql-connector的jar包2.4 配置Hive2.4.1 hive-env.sh2.4.2 hive-site.xml2.4.2.1 javax.jdo.option.ConnectionURL2.4.2.2 javax.jdo.option.Connec…...
网络安全 越权分为几种
1. 权限查看 Linux 系统中的每个文件和目录都有访问许可权限,通过其确定谁可以通过何种方式对文件和目录进行访问和操作。 文件或目录的访问权限分为只读、只写和可执行3种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改…...
PHP面试题--后端部分
本文章持续更新内容 之前没来得及整理时间问题导致每次都得找和重新背 这次整理下也方便各位小伙伴一起更轻松的一起踏入编程之路 欢迎各位关注博主不定期更新各种高质量内容适合小白及其初级水平同学一起学习 一起成为大佬 数组函数有那些 ps:本题挑难的背因为…...
HTTP~文件 MIME 类型
MIME(Multipurpose Internet Mail Extensions)类型,即多用途互联网邮件扩展类型,是一种标准,用来表示文档、文件或字节流的性质和格式。最初是为了在电子邮件系统中支持非 ASCII 字符文本、二进制文件附件等而设计的&a…...
工程化与框架系列(4)--Webpack 高级配置详解
Webpack 高级配置详解 🛠️ Webpack 是前端工程化中最流行的构建工具之一,掌握其高级配置可以帮助我们构建更高效、更优化的应用。本文将深入探讨Webpack的高级配置技巧和最佳实践。 Webpack 核心概念回顾 🌟 💡 小知识…...
Let‘s Encrypt免费证书的应用示例
文章目录 前言证书申请证书介绍cert.pemchain.pemfullchain.pemprivkey.pem 使用步骤搭建简易demo应用新建nginx配置文件测试SSL是否生效 总结 前言 最近在搞苹果应用上架的问题,据说用HTTP会被拒,但貌似不绝对,2017年苹果曾发公告说必须要求…...
线性模型 - 支持向量机
支持向量机(SVM)是一种用于分类(和回归)的监督学习算法,其主要目标是找到一个最佳决策超平面,将数据点分为不同的类别,并且使得分类边界与最近的数据点之间的间隔(margin)…...
455. 分发饼干(LeetCode)
题目来源: 455. 分发饼干 - 力扣(LeetCode) 题目内容: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i]…...
Harmony os next~鸿蒙应用开发入门教程
鸿蒙应用开发入门教程 基础准备与环境搭建 1. 了解鸿蒙系统 1.1 核心理念学习 HarmonyOS(鸿蒙系统)是华为推出的全场景分布式操作系统,其核心特点如下: 分布式能力 设备协同:手机、平板、智能手表、IoT设备等可无…...
数据库数据恢复—SQL Server附加数据库报错“错误 823”怎么办?
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复…...
树莓派安装ros docker
系统:bookworm或者ubuntu24都行 一、下载docker和拉取ros:noetic镜像 ubuntu 用鱼香ros脚本安装docker并拉取ros:noetic镜像: https://fishros.org.cn/forum/topic/20/小鱼的一键安装系列 wget http://fishros.com/install -O fishros && . …...
MyBatis-Plus 自动填充功能
MyBatis-Plus(MP) 提供了一个非常强大的功能——自动填充功能。该功能可以在执行插入或更新操作时,自动为某些字段赋值,免去手动设置这些字段的麻烦。常见的应用场景包括 创建时间 和 更新时间 字段的自动填充,帮助开发…...
折半搜索笔记
前言 01 01 01 爆搜的时间复杂度通常为 O ( 2 n ) O(2^n) O(2n),只能应付 N N N 为 20 20 20 左右的题目,但是折半搜索可以应付 N N N 为 30 30 30 ~ 40 40 40 的题目。 思想 将 N N N 个数分为前后两半,先搜索前一半的状态…...
vue 项目部署到nginx 服务器
一 vue 项目打包 1 本地环境 npm run build 2 打包完成生成一个dist 文件夹,将其放到服务器指定的文件夹,此文件夹可以在nginx 配置文件中配置 二 nginx 1 根据对应的系统搜索安装命令 sudo yum install nginx 2 查看conf位置 如果不知道的话 ng…...
JavaWeb基础专项复习6——AJAX
系列文章目录 1、JavaWeb基础专项复习1——XML文件-CSDN博客 2、JavaWeb基础专项复习2——JSP文件-CSDN博客 3、JavaWeb基础专项复习2——Servlet相关知识-CSDN博客 4、JavaWeb基础专项复习4——会话对象Session and Cookie-CSDN博客 5、JavaWeb基础专项复习5——请求对象…...
RabbitMQ快速入门
目录 MQ简介 1、同步通信 图片 2、异步通信 图片 RabbitMQ快速上手 基本介绍: Producer和Consumer Connection和Channel Virtual host Queue Exchange 工作流程 AMQP Java编写RabbitMQ生产者消费者 生产者 1.建立连接 2.开启信道 3.声明交换机 4.声…...
内存中的缓存区
在 Java 的 I/O 流设计中,BufferedInputStream 和 BufferedOutputStream 的“缓冲区”是 内存中的缓存区(具体是 JVM 堆内存的一部分),但它们的作用是优化数据的传输效率,并不是直接操作硬盘和内存之间的缓存。以下是详…...
快速列出MS Word中所有可用字体
Word中有很多字体,虽然在字体下拉列表中提供了字体的样例,但是并不全面,例如使用Batang字体的话,数字会显示成什么效果,就无法直观的看到。 打开Word应用程序,新建一个空白文档,按AltF11打开VBE…...
《机器学习数学基础》补充资料:矩阵的LU分解
本文是对《机器学习数学基础》第2章2.3.3节矩阵LU分解的拓展。 判断是否可LU分解 并非所有矩阵都可以实现LU分解。 定理1: 若 n n n 阶可逆矩阵 A \pmb{A} A 可以进行LU分解,则 A \pmb{A} A 的 k k k 阶顺序主子阵(leading principal s…...