设计模式——桥接模式

news2025/2/27 14:33:25

桥接(Bridge)模式

一、基本思想

当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。

将抽象与实现分离,使它们可以独立变化。

组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

特点:遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。

二、应用场景

  1. 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
  2. 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加。
  3. 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性。

分不清该使用继承还是组合/聚合或其他方式等,其实可以从现实语义进行思考。软件是具备现实场景的。

桥接模式的一个常见使用场景就是替换继承。我们知道,继承拥有很多优点,比如,抽象、封装、多态等,父类封装共性,子类实现特性。继承可以很好的实现代码复用(封装)的功能,但这也是继承的一大缺点。

因为父类拥有的方法,子类也会继承得到,无论子类需不需要,这说明继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。因此,在设计模式中,有一个原则为优先使用组合/聚合,而不是继承。

三、结构图

结构图

  1. 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  2. 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  4. 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

四、代码实现

代码实现

五、优缺点

优点:
  1. 抽象与实现分离,扩展能力强
  2. 符合开闭原则
  3. 符合合成复用原则
  4. 其实现细节对客户透明
缺点:
  1. 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

六、桥接模式的扩展

在软件开发中,有时桥接模式可与适配器模式联合使用。

当桥接(Bridge)模式的实现化角色的接口与现有类的接口不一致时,可以在二者中间定义一个适配器将二者连接起来。
在这里插入图片描述

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

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

相关文章

运维面试必问的中间件高频面试题

1. redis是单线程还是多线程? 这个问题已经被问过很多次了,从redis4.0开始引入多线程,redis 6.0 中,多线程主要用于网络 I/O 阶段,也就是接收命令和写回结果阶段,而在执行命令阶段,还是由单线程…

综述类论文_Machine Learning for Encrypted Malicious Traffic Detection(重要)

文章目录Machine Learning for Encrypted Malicious Traffic Detection: Approaches, Datasets and Comparative Study摘要存在的问题论文贡献1. 基于机器学习的加密流量检测模型的总体框架1.1 Research Target(研究目标)1.2 Traffic Dataset Collection…

Allegro给各种形式的板框导弧操作指导

Allegro给各种形式的板框导弧操作指导 Allegro可以给板框导弧,让加工出来的板框更加圆滑,具体操作步骤如下 板框是line形式的 选择Manufacture-Drafting-Fillet命令 在Options里面Radius输出导弧的半径,比如78.74 框选两个线段的部分 完成后的效果如下图 框选4个角落,…

Python基础学习

一、Python基础 1.Python介绍 2.发展史 3.Python 2 or 3? 4.安装 5.Hello World程序 6.变量 7.用户输入 8.模块初识 9. .pyc是个什么鬼? 10.数据类型初识 11.数据运算 12.表达式if ...else语句 13.表达式for 循环 14.break and continue 15.表达式while 循环…

最好的Python入门教材是哪本?这本书当之无愧

1.门槛低 适合编程零基础上手 《Python编程 从入门到实践(第二版)》的作者埃里克马瑟斯(Eric Matthes)是一名高中科学和数学老师,现居住在阿拉斯加,在当地讲授 Python 入门课程。他从 5 岁开始就一直在编写…

带你深度解析虚幻引擎4的照明和阴影知识

照明是渲染的重要组成部分。有静态光和动态光,它们往往很重并且需要大量计算。今天就让赞奇云工作站带领小伙伴们来学习一下虚幻引擎4中的光照和阴影的知识。 静态照明 静态光在编辑器中预先计算并保存在光照贴图中。 〇:良好的性能和质量&#xff08…

[go学习笔记.第十五章.反射,常量] 1.反射的基本介绍以及实践

一.反射的引入以及基本介绍 1.看两个问题 (1).对于结构体的序列化和反序列化,看一段代码 package mainimport("fmt" "encoding/josn" )type Monster struct {Name string json:"monsterName"Age int json:"monsterAge&quo…

Android商城开发----点击左侧分类列表右侧更新对应列表内容

Android商城开发----点击左侧分类列表右侧更新对应列表内容 目录Android商城开发----点击左侧分类列表右侧更新对应列表内容一、首先说布局:二、主要说一下,布局完成后实现点击左侧类别时,右侧展现对应类的商品列表。主要思想:源代…

Vue3响应系统的实现(二)

前言 继上一篇文章,我们已经能够实现一个简单的响应系统了,但是仍然存在很多缺陷,本篇文章将具体叙述一下存在的缺陷以及如何解决,最后实现一个较为完善的响应式系统 解决副作用函数硬编码问题 从上一篇文章中我们不难发现响应…

概率 | 【提神醒脑】重难点专题突破 自用笔记

本文总结参考于 kira 2023概率提神醒脑技巧班 中 —— 重难点专题。 笔记均为自用整理。加油!ヾ(◍∇◍)ノ゙ 一研为定! 一、条件均匀 / 指数 / 二项…分布 -------------------------------------------------------------------------------------------------------------…

基于inquirer实现一个控制台多级选择交互功能

说在前面 🎈在前端脚手架工具中经常会看到控制台输入参数等操作。例如Vue-cli中初始化项目会提示选择一些参数等。所以在开发脚手架工具或者node控制台程序,就需要用到inquirer工具或者类似的工具。但是使用过inquirer工具的同学应该知道,目前…

SpringSecurity整合SSM和SpringBoot完成方法级权限控制

初识权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源。权限管理几乎出现在任何系统里面,前提是需要有用户和密码认证的系统。 在权限管理的概念中,有两个非常重要的名词&…

SpringBoot SpringBoot 开发实用篇 1 热部署 1.4 关闭热部署功能

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇1 热部署1.4 关闭热部署功能1.4.1 关闭热部署1.4.2 小结1.4.3 总结1 …

大佬神作!Spring Security从应用到源码,这份手册都讲全了,已三刷

简介 平时我们写 Web 项目,都需要用户登录时验证,以及权限管理之类的操作,以前使用过滤器,拦截器等进行管理,原生代码较多。 所以出现了安全框架以供我们使用,安全框架在 Web 应用的主要功能是&#xff1a…

金九失足,10月喜提“Java高分指南”,11月冲击大厂

蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力、培训、出国、大公司的经历,还有很多很好的朋友。但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,…

VS2017安装教程(详细版)

1.首先下载好安装包 百度网盘下载链接 链接:https://pan.baidu.com/s/1HW8hrLMazRsBkPvkDHkD1Q?pwdz4jg 提取码:z4jg 2.下载到桌面以管理员身份运行 点击继续 3.进入后更改安装位置,选择安装路径,千万不要安装到C盘 4.改完后…

Opencv——直方图、掩膜、直方图均衡化详细介绍及代码实现

一、图像直方图 1.1 定义: 图像直方图是图像的基本属性之一,也是反映图像像素数据分布的统计学特征,其横坐标代表了图像像素点在[0,255]范围中,纵坐标代表图像像素点出现的个数或百分比。如图: 1.2 函数:…

Go程序内存泄露问题快速定位

前几天有同学反馈了 cgo 内存泄露问题,自己也针对这个问题探索了一番,算是为以后解决类似问题提前攒点经验吧。也趁机整理了一下 go 开发过程中内存泄露问题的一些常用排查方法,也希望对新接触 go 的同学有所帮助。整理之余,bcc 工…

面试问题:MD5属于哪种加密算法?千万别踩这些坑

一些小伙伴吐槽,去面试的时候经常听到面试官问这样的问题,“对称加密”、“非对称加密”、“MD5加密”,那么MD5到底属于哪种加密算法?遇到这样的问题,一定要小心,这是面试官给你挖的坑呢,可别傻…

C++——pair用法总结

C——pair用法总结1.pair概述&#xff08;在标头 <utility> 定义&#xff09;2.pair使用2.1成员函数&#xff08;构造函数、赋值函数&#xff09;2.2非成员函数2.3辅助类使用1.pair概述&#xff08;在标头 定义&#xff09; std::pair 是类模板&#xff0c;提供在一个单…