设计模式之~桥接模式

news2024/11/28 7:35:51

桥接模式:

        将抽象部分与它的实现部分分离,使他们都可以独立地变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

        什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和他的派生类用来实现自己的对象。实现系统可能有多角度分类,每种分类都有可能变化,那么就把这种多角度分离出来让它们对立变化,减少它们之间的耦合。只要真正深入了解设计原则,很多设计模式其实就是原则的应用而以,或许在不知不觉中就在使用设计模式了。

        桥接模式的主要目的是通过组合的方式建立两个类之间的关系,而并不通过继承来实现,桥接模式的核心在于解耦抽象和实现。

合成/聚合复用原则:

       在面向对象设计中,我们还有一个很重要的设计原则,那就是合成/聚合复用原则:即优先使用对象合成/聚合,而不是类继承

        合成/聚合复用原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类并封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

        对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

       聚合表示一种弱的‘拥有’关系,体现的是a对象可以包含b对象,但b对象不是a对象的一部分;

       合成则是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

结构图:

        

实例:

        由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。

优点:

桥接模式的主要目的是通过组合的方式建立两个类之间的关系,而并不通过继承来实现,桥接模式的核心在于解耦抽象和实现。(符合合成复用原则)

分离了抽象部分及其实现部分两个维度,实现了代码的解耦,提高了系统的扩展性。

扩展功能时只需要新增类,无需修改源代码,符合开闭原则。

缺点:

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程

适用场景:

        桥接模式就是将抽象部分与它的实现部分分离,其实就是实现系统可能有多角度分类,每一种分类都可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。在发现我们需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放-封闭原则时,就应该要考虑用桥接模式了。

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

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

相关文章

图解系列 图解Spring Boot 最大连接数及最大并发数

文章目录 概序架构图TCP的3次握手4次挥手时序图核心参数AcceptCountMaxConnectionsMinSpareThread/MaxThreadMaxKeepAliveRequestsConnectionTimeoutKeepAliveTimeout 内部线程AcceptorPollerTomcatThreadPoolExecutor 测试参考 每个Spring Boot版本和内置容器不同,…

树状数组学习总结

今天本初中生蒟蒻学习了一下 树状数组 \color{red}{树状数组} 树状数组,总结一下~~~ 树状数组的实现 功能简介 快速求前缀和( O ( l o g 2 n ) \color{purple}{O(log_2n)} O(log2​n))修改某一个数( O ( l o g 2 n ) \color{gr…

SpringBoot+原生awt,实现花花绿绿的图形验证码

图形验证码是用于验证用户身份的一种方式,通常在网站注册、登录或进行某些敏感操作时会使用。它通过展示一个包含随机字符或数字的图形,要求用户输入相应的字符或数字来证明其为真人而非机器人。图形验证码能有效地防止机器人攻击和恶意注册行为&#xf…

Excel·VBA自动生成日记账的对方科目

如图:根据日记账/序时账的日期、凭证号为一组,按借贷方向生成相反的科目,并写入H列。可能存在一对一、一对多、多对多等情况的账目 目录 数组法遍历、判断、写入测试结果 多对多问题处理测试结果 数组法遍历、判断、写入 适用日期凭证号连续…

HTTPS的加密流程——巨详细!

文章目录 前言HTTPS的工作过程引入对称加密引入非对称加密引入证书完整的加密流程总结 前言 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况. 比如:臭…

民宿预订系统的设计与实现(ASP.NET,SQLServer)

这个民宿预订系统是由第三方的运营公司来运营,他提供了一个民宿和客户都使用的一个信息平台,民宿注册之后把自己的民宿信息发布到网站平台上,然后发布自己的房间信息,打折信息等供客户查看和选择。客户可以在网站平台上查看民宿信…

深度学习:大模型的正则化

l1l2正则和dropout正则化[https://youzipi.blog.csdn.net/article/details/75307522] LN和BN归一化 [深度学习:批归一化Batch Normalization] 主流大模型使用的Normalization主要有三类,分别是Layer Norm,RMS Norm,以及Deep Norm。 Post-Norm和Pre-Norm 根据Normalizat…

网工内推 | 快手、瑞芯微招运维,思科、红帽认证优先

01 快手 招聘岗位:IT系统运维 职责描述: 1、负责IT基础架构运维体系的建设和优化改进; 2、负责IT核心基础服务(如DNS、负载均衡、容器)的架构设计、平台建设和运维; 3、负责IT内部日志系统、监控系统、报警…

SpringCloud微服务框架(通俗易懂,一秒上手)

🎁🎁资源:https://pan.baidu.com/s/1zRmwSvSvoDkWh0-MynwERA&pwd1234 SpringCloud微服务框架 (一)认识微服务服务架构演变SpringCloud (二)微服务拆分案例服务拆分服务间调用 (三…

ROS:订阅者Subscriber的编程实现(C++)

目录 一、话题模型二、创建功能包三、创建Subscriber代码四、编译代码五、运行 一、话题模型 图中,我们使用ROS Master管理节点。 有两个主要节点: Publisher,名为Turtle Velocity(即海龟的速度) Subscriber&#xff0…

Rocketmq面试(一) Rocketmq同一个消费组订阅不同的Tag,会有什么问题?

先说结果:会造成数据丢失 再说依据: RocketMQ要求同一个消费者组内的消费者必须订阅关系一致,如果订阅关系不一致会出现消息丢失的问题。 官网入口:订阅关系一致 | RocketMQ 不想看官网的,直接看结论 什么叫订阅关…

复杂SQL实践-MYSQL

MySQL 8.0窗口函数 MySQL从8.0版本开始支持窗口函数。 窗口函数总体上可以分为序号函数, 分布函数, 前后函数, 首尾函数和其他函数。 描述 题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。 示例1 drop table if exist…

对远程http服务的拨测体验

背景: 过程是这样的,需要与合作方数据进行交互(肯定是不允许直接连对方数据源的),对方提供了两台server,后端同事在server上面作了proxy搭建了桥接的应用(两台server没有公网ip,通过…

Eclipse 教程Ⅹ

本次内容会涉及到Eclipse 重构菜单、Eclipse 添加书签和Eclipse 任务管理,老规矩,直接开始吧! Eclipse 重构菜单 使用Eclipse重构 在项目开发中我们经常需要修改类名,但如果其他类依赖该类时,我们就需要花很多时间去…

机器学习模型的生命周期

动动发财的小手,点个赞吧! 您的模型如何变化?Source[1] 诞生 当我们构建、训练、拟合或估计我们的模型时,这些数字工具就诞生了。这个阶段几乎从拥有分析目标、数据、计算机、算法以及数据科学家现在已经非常了解的其他一切开始。…

Linux [权限]

Linux 权限 Linux用户分类切换成root方法例子 切换成普通用户方法例子 短暂提权 什么是权限理论知识展示区域 修改权限(1)修改文件属性1. 采用 w/r/x的形式2. 采用八进制的形式 (2)修改身份1. 修改拥有者2. 修改所属组3. 修改拥有者 && 所属组 问题区问题1问题2问题3 L…

实在智能携手各高校打造高端数字化技能教育平台

百年大计,教育为本。2021年在《教育部办公厅关于印发高等职业教育专科英语、信息技术课程标准)的通知中把机器人流程自动化列入专科信息技术课程学习计划之中,进一步明确职业教育中数字化人才发展方向。 一、为什么要大力培养数字化人才&…

毕业5年的同学突然告诉我,他已经是年薪30W的自动化测试工程师,我愣住了...

作为一名程序员,都会对自己未来的职业发展而焦虑。一方面是因为IT作为知识密集型的行业,知识体系复杂且知识更新速度非常快,“一日不学就会落后”。 另外一方面,IT又是劳动密集型的行业,不仅业人员多,而且个…

随机梯度下降法

梯度下降法有两个比较大的缺点: --计算花时间 --容易陷入局部最优解 比如以下形状的函数,最优解取决于初始值的选取。 梯度下降法的表达式如下,这个表达式使用了所有训练数据的误差: 随机梯度下降法表达式: 在随机梯…

Cmake学习记录(九)--使用Cmake交叉编译.so库

文章目录 一、前言二、相关代码三、参考链接 一、前言 目前Android编译.so的话使用Android Studio比较简单,但是有时候时候Android Studio的话还需要创建一个Android的项目,这里记录下脱离Android Studio单纯使用Cmake和C开发工具Clion(或者其他的开发工…