【设计模式】适配器和桥接器模式有什么区别?
今天我探讨一下适配器模式和桥接模式,这两种模式往往容易被混淆,我们希望通过比较他们的区别和联系,能够让大家有更清晰的认识。
适配器模式:连接不兼容接口
当你有一个类的接口不兼容你的系统,而你又不希望修改这个类的源代码时,适配器模式就能派上用场。适配器模式作用在已有组件的接口层面,使之能够满足客户端的期望接口。

例如,你有一台彩色打印机,但是你的图形处理系统只支持黑白打印机:
// 你的图形处理系统只能接受这个接口
interface BlackWhitePrinter {void printBlackWhite();
}// 但是你有的是彩色打印机:
class ColorPrinter {void printColor() {System.out.println("Printing Color");}
}// 适配器模式就派上用场了
class PrinterAdapter implements BlackWhitePrinter {private final ColorPrinter colorPrinter;public PrinterAdapter(ColorPrinter colorPrinter) {this.colorPrinter = colorPrinter;}@Overridepublic void printBlackWhite() {colorPrinter.printColor();}
}
桥接模式:划分接口和实现
桥接模式通过将抽象和实现解耦,使得两者可以独立进行变化。它的主要目标是避免当修改实现时,需要同时修改接口。

比如我们有一个图形API,定义有多种形状,比如矩形、圆形等。同时,每种形状都可能有多种绘制方式,比如OpenGL、Vulkan。如果不采用桥接模式,很可能会出现类名如OpenGLRectangle, OpenGLCircle, VulkanRectangle, VulkanCircle…这显然是一种不好的设计,因为每次添加或修改一个图形类型或绘制方式,都会影响另一方。
而相反,通过桥接模式,我们可以把Shape和DrawAPI解耦:
interface DrawAPI { // 抽象接口void draw();
}
class Shape {protected DrawAPI api; public Shape(DrawAPI api) {this.api = api;}public void draw() {api.draw(); // 调用实现}
}class OpenGL implements DrawAPI {@Overridepublic void draw() {System.out.println("OpenGL drawing");}
}
class Vulkan implements DrawAPI {@Overridepublic void draw() {System.out.println("Vulkan drawing");}
}
这样我们就可以任意组合Shape和DrawAPI:
Shape openglShape = new Shape(new OpenGL());
Shape vulkanShape = new Shape(new Vulkan());
两者的区别和联系
虽然适配器模式和桥接模式在表面上有诸多相似之处,比如他们都试图使得两个或以上的类或接口能够协同工作,但是他们的应用场景和目标是不一样的。
适配器模式关注的是如何使已有组件能够适应你的接口以达到代码重用,它解决的是“已经存在”的问题。
而桥接模式关注的是如何设计你的抽象和实现,使其能够独立变化,它解决的是“尚未发生”的问题。
更进一步的讲:
- 适配器模式:适配器模式的主要目标是让原本接口不兼容的两个接口可以协同工作。它通常被用在已经存在的系统中,以解决现有组件与系统其他部分的兼容性问题。通常情况下,适配器会封装已经存在的组件,并提供一个与系统其余部分兼容的接口。
- 桥接模式:桥接模式的主要目标在于将抽象与实现解耦,使得两者可以独立地变化。这种解耦使得抽象和实例化可以沿着各自的轴线变化,也就是说,抽象层次结构的改变不会影响到实例化层次结构的改变,反之亦然。
希望这篇文章能够帮助你理解适配器模式和桥接模式,以及他们的区别和联系。学习设计模式是一个长期的过程,不要着急,慢慢积累,总会有收获的。
相关文章:
【设计模式】适配器和桥接器模式有什么区别?
今天我探讨一下适配器模式和桥接模式,这两种模式往往容易被混淆,我们希望通过比较他们的区别和联系,能够让大家有更清晰的认识。 适配器模式:连接不兼容接口 当你有一个类的接口不兼容你的系统,而你又不希望修改这个…...
C语言应用层程序热补丁
一、热补丁简介 一个正在运行的程序,要是有某函数或某流程有问题,需要修改,有两个方式: 1.通过设置LD_PRELOAD把需要的库重新定向,但这种方式需要重启正在运行的程序。 2.通过修改可执行文件某个函数指向的地址&…...
【代码随想录+力扣hot100】双指针
文章目录 27. 移除元素思路:代码: 26. 删除有序数组中的重复项代码:思路一:重复元素必相邻思路二:从第一个位置开始考虑快慢指针 977.有序数组的平方思路:代码: 283. 移动零代码:思路…...
【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(三):性能优化策略
关于MySQL部分的核心知识进行一网打尽,包括三部分:基础知识考察、核心机制策略、性能优化策略,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第三部分:性能优化策略,子节点表示追问或同级提问 读写分离 分布式数据库的…...
qnx 上screen + egl + opengles 最简实例
文章目录 前言一、qnx 上的窗口系统——screen二、screen + egl + opengles 最简实例1.使用 addvariant 命令创建工程目录2. 添加源码文件3. common.mk 文件4. 编译与执行总结参考资料前言 本文主要介绍如何在QNX 系统上使用egl和opengles 控制GPU渲染一个三角形并显示到屏幕上…...
python基础学习-02
基本的程序设计模式 任何的程序设计都包含IPO,它们分别代表如下: I:Input 输入,程序的输入 P:Process 处理,程序的主要逻辑过程 O:Output 输出,程序的输出 因此如果想要通过计算…...
服务调用Ribbon,LoadBalance,Feign
服务调用Ribbon、Fegin Ribbon实现负载均衡的原理 1:LoadBalancerAutoConfiguration这个类,这个类主要做的就是把LoadBalancer拦截器封装到RestTemplte拦截器集合里面去。 2:然后在代码里面调用restTemplate.getForObject或者其他方法的时候&…...
一条sql是如何运行的
在我们平时使用sql的时候,基本是基于黑盒的使用方式,在客户端输入一条sql语句,然后回显想要的数据,对于mysql server端内部如何运行的以及与存储引擎如何交互的不得而知。 通过下面一幅图,大致描述客户端和服务端交互…...
SystemC学习笔记(三) - 查看模块的波形
简述 波形在Simulation/Emulation中地位十分重要,尤其是在研发初期,只能通过波形来查看软件hang住的位置。 对于TLM来说,查看波形一般是指查看pvbus上的transaction,而对于SystemC本身来说,查看波形就是使用Gtkwave或…...
计算机网络(第六版)复习提纲5
SS2.2 有关信道的几个基本概念 2.通信模型 三个主要部分:信源、信道、信宿 3.通信方式: a)术语:消息(传递的内容)、数据(传递的形式)、信号(数据表现形式,有模拟信号和数字信号两种&…...
JavaScript 学习笔记(WEB APIs Day3)
「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. JavaScript 学习笔记(Day1) 2. JavaSc…...
Springboot自动装配:三个注解、Selector、spring.factories文件、@ConditionalOnProperty注解
借鉴: 这个链接是包含run方法进来debug看整个过程的,建议先看:https://www.cnblogs.com/starsray/p/15580915.html https://blog.csdn.net/fengxiandada/article/details/130080828 Springboot自动装配 1.创建springboot应用 如何创建一个s…...
软件工程应用题汇总
绘制数据流图(L0/L1/L2) DFD/L0(基本系统模型) 只包含源点终点和一个处理(XXX系统) DFD/L1(功能级数据流图)在L0基础上进一步划分处理(XXX系统) 个人理解 DFD/L2(在L1基础上进一步分解后的数据流图) 数据…...
P1789 【Mc生存】插火把(C语言)
首先,我们可以先用数组来储存地图(建议用int,我试过bool会RE) 每次读入火把和萤石的坐标 接着把能照亮的地方标记起来 最后用计数器统计会生成怪的地方有钻石的话还怕怪吗 最后,上代码 #include<stdio.h> i…...
计算机网络(第六版)复习提纲6
SS2.3 导引型传输媒体 1.三类位非导引型传输媒体 a)双绞线:两根铜线平行会相互干扰,垂直干扰最小,双绞线近似垂直,绞合度越高,可用的数据传输率越高。 i.无屏蔽双绞线UTP(便宜) ii.屏蔽双绞线&a…...
安卓平板局域网内远程控制工控机方法
安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上,将安卓平板连接上WiFi,如下图所示 下载NoMachine远程软件安装包,官网地址:https://www.nomachine.com/ 点击Download now按钮…...
pinctrl子系统简介
一. 简介 上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。 Linux 是一个庞大而完善的系统, 尤其是驱动框架,像 GPIO …...
基于51单片机的温度报警控制系统Protues仿真设计
目录 一、设计背景 二、实现功能 三、总体硬件设计 四、仿真演示 四、源程序 一、设计背景 随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与了解环境温度。特别地,高温情况下极易造成火灾,例如,在…...
多级缓存
一、多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时ÿ…...
【已解决】如何用typedef简化函数指针
博文内容简短,主要介绍typedef简化函数指针,形式是typedef int(*pp)(int,int);并用一个加法的例子去演示,如何用typedef简化函数指针。 示例 #include<stdio.h> int add(int a,int b) {return a b; } typedef int(*p)(int, int); in…...
3分钟完成Windows包管理器Winget的终极一键安装指南
3分钟完成Windows包管理器Winget的终极一键安装指南 【免费下载链接】winget-install Install WinGet using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2019/2022. 项目地址: https://gitcode.com/gh_mirrors/wi/winget-instal…...
安装部署Keystone
一、以下命令安装了Keystone组件的必要软件包。 [rootcontroller ~]# yum -y install openstack-keystone httpd mod_wsgi 二、MariaDB数据库配置 [rootcontroller ~]# mysql -uroot -p000000 查看当前已有数据库: show databases;第2步,新建“keyston…...
2026年4K投影仪画质横评:明基W系列“色彩科学”解析
一、开篇点题:画质之争,终归是色彩之争2026年的4K投影仪市场,参数竞赛已进入白热化。当分辨率、亮度、对比度等硬指标逐渐趋同,真正拉开产品差距的,是那个决定画面灵魂的核心——色彩。一台投影仪能否精准还原电影导演…...
番茄小说下载器终极指南:如何轻松下载EPUB、TXT和有声小说
番茄小说下载器终极指南:如何轻松下载EPUB、TXT和有声小说 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾经在番茄小说上找到一部精彩的作品,…...
TVA视觉新范式:工业视觉的百年未有之大变局(4)
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
量子计算如何革新机器翻译:QEDACVC系统解析
1. 量子计算与机器翻译的技术融合量子计算正在为自然语言处理领域带来革命性的变化。传统机器翻译系统依赖于经典计算机架构,如基于Transformer的模型,虽然取得了显著进展,但在处理低资源语言和实时多语言场景时仍面临挑战。量子机器翻译的核…...
福特押注五款新车型,含电动车与Bronco,欲重振欧洲市场
福特计划未来三年内在欧洲推出五款全新乘用车,以重振其在欧洲市场日渐式微的品牌形象。这一"福特欧洲乘用车新纪元"计划涵盖一款全新的多能源Bronco SUV、一款小型纯电掀背车、一款纯电SUV,以及两款多能源跨界SUV,所有车型均专为欧…...
LeetCode 所有路径题解
LeetCode 所有路径题解 题目描述 给定一个有向无环图,找到所有从源节点到目标节点的路径。 示例: 输入:graph [[1,2],[3],[3],[]]输出:[[0,1,3],[0,2,3]] 解题思路 方法:回溯 思路: 使用回溯算法遍历所有可…...
【2026 最新】Web 安全完整学习指南 红队全套技能栈
0x00 技能栈 依照红队的流程分工,选择适合自己的技能栈发展。 越接近中心的能力点越贴近web技术栈,反之亦然。可以根据自身情况,选择技术栈的发展方向。 0x01 漏洞理解篇(Vulnerability) 1.1 前端 同源策略 & CSP & JOSNP 跨域…...
压接 vs 焊接:高速连接器组装工艺的选型指南与实战对比
摘要/前言在通信设备、工业控制及数据中心硬件设计中,连接器的组装工艺选择直接影响产品的可靠性、可维护性与生产良率。压接(Press-Fit)与焊接(Soldering)是当前通孔连接器最主要的两种电气互连方式。压接依靠过盈配合…...
