结构型设计模式——桥接模式
摘要
桥接模式(Bridge pattern): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。
一、桥接模式的意图
将抽象与实现分离开来,使它们可以独立变化。
二、桥接模式的类图

- Abstraction: 定义抽象类的接口
- Implementor: 定义实现类接口
三、桥接模式的实现
RemoteControl 表示遥控器,指代 Abstraction。TV 表示电视,指代 Implementor。桥接模式将遥控器和电视分离开来,从而可以独立改变遥控器或者电视的实现。
public abstract class TV {public abstract void on();public abstract void off();public abstract void tuneChannel();
}
public class Sony extends TV {@Overridepublic void on() {System.out.println("Sony.on()");}@Overridepublic void off() {System.out.println("Sony.off()");}@Overridepublic void tuneChannel() {System.out.println("Sony.tuneChannel()");}
}
public class RCA extends TV {@Overridepublic void on() {System.out.println("RCA.on()");}@Overridepublic void off() {System.out.println("RCA.off()");}@Overridepublic void tuneChannel() {System.out.println("RCA.tuneChannel()");}
}
public abstract class RemoteControl {protected TV tv;public RemoteControl(TV tv) {this.tv = tv;}public abstract void on();public abstract void off();public abstract void tuneChannel();
}
public class ConcreteRemoteControl1 extends RemoteControl {public ConcreteRemoteControl1(TV tv) {super(tv);}@Overridepublic void on() {System.out.println("ConcreteRemoteControl1.on()");tv.on();}@Overridepublic void off() {System.out.println("ConcreteRemoteControl1.off()");tv.off();}@Overridepublic void tuneChannel() {System.out.println("ConcreteRemoteControl1.tuneChannel()");tv.tuneChannel();}
}
public class ConcreteRemoteControl2 extends RemoteControl {public ConcreteRemoteControl2(TV tv) {super(tv);}@Overridepublic void on() {System.out.println("ConcreteRemoteControl2.on()");tv.on();}@Overridepublic void off() {System.out.println("ConcreteRemoteControl2.off()");tv.off();}@Overridepublic void tuneChannel() {System.out.println("ConcreteRemoteControl2.tuneChannel()");tv.tuneChannel();}
}
public class Client {public static void main(String[] args) {RemoteControl remoteControl1 = new ConcreteRemoteControl1(new RCA());remoteControl1.on();remoteControl1.off();remoteControl1.tuneChannel();}
}
四、桥接模式的总结
- 使用的场景?:
- 本质是什么?:
- 它解决了什么问题?: 封装一个对象的构造过程,并允许按步骤构造。
- 它体现了设计模式中什么原则?
- 存在的缺陷?
- 你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?:
- 开源架构中哪些使用了这一模式?
博文参考
相关文章:
结构型设计模式——桥接模式
摘要 桥接模式(Bridge pattern): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。 一、桥接模式的意图 将抽象与实现分离开来,使它们可以独立变化。 二、桥接模式的类图 Abstraction: 定义抽象类的接口Implementor: 定义实现类接口 …...
keepalived的vip实现nginx节点的主备
nginx wget http://nginx.org/download/nginx-1.18.0.tar.gz tar zxvf nginx-1.18.0.tar.gzyum install -y gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel libnl3-develcd nginx-1.18.0 mkdir -p /usr/local/nginx #需要使用https,在编译时启用…...
C++之std::atomic解决多线程7个问题(二百四)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
tailwindcss 如何在 uniapp 中使用
直接使用https://tailwindcss.com/docs/guides/vite这篇官方教程的写法是跑不通的,摸索以后整理了一下,最关键的是第6步 npm install -D tailwindcss postcss autoprefixernpx tailwindcss init -p在 tailwind.config.js 中写入 export default {conten…...
oracle-使用PLSQL工具自行修改用户密码
1、使用PLSQL工具,输入用户名和原密码登录,如下图 2、登录后,在会话下拉菜单中找到”Change password..” 3、在跳出的窗口中配置新密码,修改完成后单击”确认”,后退出PLSQL 4、重新打开PLSQL,使用新密码登…...
自动驾驶技术:现状与未来
自动驾驶技术:现状与未来 文章目录 引言自动驾驶技术的现状自动驾驶技术的挑战自动驾驶技术的未来结论结论 2023星火培训【专项营】Apollo开发者社区布道师倾力打造,包含PnC、新感知等的全新专项课程上线了。理论与实践相结合,全新的PnC培训不…...
C++ 类构造函数 析构函数
类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地…...
C++标准模板(STL)- 输入/输出操纵符-(std::get_time,std::put_time)
操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。 不以参数调用的操纵符(例如 std::cout << std::boolalpha; 或 std::cin >> std::hex; )实现为接受到流的引用为其唯一参数的函数。 basic_ostream::…...
蓝桥等考Python组别九级004
第一部分:选择题 1、Python L9 (15分) 运行下面程序,可以输出几行“*”?( ) for i in range(3): for j in range(4): print(*, end = ) print() 2345正确答案:B 2、Python L9...
gitee 远程仓库操作基础(二)
(1)clone远端仓库,本地建立分支推送 (基于远程仓库版本库 本地建立分支开发新功能) git clone gitgitee.com:xxxxx/alsa_test.git git remote add origin gitgitee.com:xxxxx/alsa_test.git进入clone过后路径代码,查看本地分支,发现该项目远程仓库有很多分支 基于…...
Scala第四章节
Scala第四章节 scala总目录 章节目标 掌握分支结构的格式和用法掌握for循环和while循环的格式和用法掌握控制跳转语句的用法掌握循环案例理解do.while循环的格式和用法 1. 流程控制结构 1.1 概述 在实际开发中, 我们要编写成千上万行代码, 代码的顺序不同, 执行结果肯定也…...
【C++入门指南】类和对象(上)
【C杂货店】类和对象(上) 一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装4.1 访问限定符4.2 封装 五、类的作用域六、类的实例化七、类对象模型7.1 类对象的存储规则7.2 例题7.3结构体内存对齐规则 八、this指针8.2 t…...
web:[极客大挑战 2019]PHP
题目 点进页面显示如下 根据页面提示,这个网站有备份文件,备份文件一般是bak文件格式,用dirsearch扫描 访问之后下载了一个文件 里面都是一些代码 在index.php中发现了一个类的文件,一个get传参,然后将传进的值进行反序…...
Firefox 开发团队对 Vue 3 进行优化效果显著
Mozilla 官方博客近日发表文章《Faster Vue.js Execution in Firefox》,介绍了 Firefox 开发团队对 Vue 3 进行的优化。 文章写道,在使用 Speedometer 3 对 Firefox 进行基准测试时,他们发现 Vue.js test 的测试结果从 Vue 2 升级到 Vue 3 后…...
【Verilog 教程】6.5 Verilog避免Latch
关键词:触发器,锁存器 Latch 的含义 锁存器(Latch),是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值。仅当锁存器处于使能状态时,输出才会随着…...
怒刷LeetCode的第21天(Java版)
目录 第一题 题目来源 题目内容 解决方法 方法一:哈希表 方法二:计数器数组 第二题 题目来源 题目内容 解决方法 方法一:分治法 方法二:快速幂 迭代 方法三:快速幂 递归 第三题 题目来源 题目内容 …...
Armv9 Cortex-A720的L2 memory system 和 L2 Cache
9 L2 memory system Cortex-A720核心的L2内存系统通过CPU bridge连接core与DynamIQ Shared Unit-120,其中包括私有的L2缓存。 L2缓存是统一的,每个Cortex-A720核心在一个集群中都有私有的L2缓存。 L2内存系统包括使用虚拟地址(VA)和程序计数器(PC)的数据预取引擎。不同…...
蓝桥等考Python组别九级003
第一部分:选择题 1、Python L9 (15分) 运行下面程序,可以输出几行“*”?( ) for i in range(3): for j in range(4): print(*, end = ) print() 6374正确答案:B 2、Python L9...
Python异步框架大战:FastAPI、Sanic、Tornado VS Go 的 Gin
一、前言 异步编程在构建高性能 Web 应用中起着关键作用,而 FastAPI、Sanic、Tornado 都声称具有卓越的性能。本文将通过性能压测对这些框架与Go的Gin框架进行全面对比,揭示它们之间的差异。 原文:Python异步框架大战:FastAPI、Sa…...
Docker笔记1
一、Docker介绍 Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 容器是完全使用沙箱机制&a…...
PlatformIO脚本进阶:告别修改库文件,用Python脚本精准控制FreeRTOS heap文件编译
PlatformIO脚本进阶:精准控制FreeRTOS堆管理文件编译的工程实践 在嵌入式开发中,第三方库的管理一直是个令人头疼的问题。特别是像FreeRTOS这样的实时操作系统,其源代码结构往往包含多个可选组件,开发者需要根据具体硬件和需求选择…...
SEO_详解SEO优化的完整工作流程与执行要点
<h2>SEO优化的重要性</h2> <p>在当前数字化时代,网站的可见度和流量直接关系到企业的市场竞争力。搜索引擎优化(SEO)作为提升网站在搜索引擎中排名的关键手段,其重要性不言而喻。SEO不仅能帮助企业吸引更多的自…...
无限级数求和的Java实现与数学分析
本文旨在详细说明如何使用Java精确计算特定形式的无限级数 S -(2x)^2/2! (2x)^4/4! - (2x)^6/6! ... 在指定区间 [0.1, 1.5] 内部和。我们将深入分析等级数的数学性质,推导其闭合形式,并在此基础上纠正原始Java代码…...
pyNastran:工程仿真领域的Python变革者——打破商业软件垄断的技术突围
pyNastran:工程仿真领域的Python变革者——打破商业软件垄断的技术突围 【免费下载链接】pyNastran A Python-based interface tool for Nastrans file formats 项目地址: https://gitcode.com/gh_mirrors/py/pyNastran 价值定位:重新定义工程仿真…...
SAR成像RD算法仿真:为什么你的点目标旁瓣降不下去?从原理到Matlab代码的深度调优
SAR成像RD算法旁瓣抑制难题:从原理到Matlab调优实战 当你在Matlab中实现RD(距离多普勒)算法进行SAR(合成孔径雷达)成像仿真时,是否遇到过这样的困扰:明明按照教科书步骤编写了代码,但…...
Qwen2.5-Omni:多模态流式交互的Thinker-Talker架构与TMRoPE技术解析
1. Qwen2.5-Omni的核心设计理念 第一次接触Qwen2.5-Omni时,最让我惊讶的是它处理多模态数据的流畅程度。想象一下,你正在和AI助手讨论一段视频内容,它能同时理解画面中的物体、背景音乐的情绪,还能用自然语音回应你的问题——这就…...
PostgreSQL(OpenGauss/MogDB) 大小写转换实战:批量处理表名与字段名的自动化方案
1. 为什么PostgreSQL的大小写问题让人头疼? 第一次用PostgreSQL的时候,我就被它的大小写规则坑惨了。明明在Oracle里运行好好的SQL语句,搬到PostgreSQL就报"relation does not exist"错误。后来才发现,原来PostgreSQL对…...
嵌入式系统常用轻量级校验算法解析
单片机中常用的轻量级校验算法 1. 校验算法概述 在嵌入式系统开发中,数据校验是确保通信可靠性和数据完整性的关键技术手段。无论是UART通信中的奇偶校验、CAN总线中的CRC校验,还是Modbus、MAVlink、USB等协议中的校验机制,都体现了校验算法…...
阿里云轻量应用服务器上5分钟搞定EMQ X MQTT集群搭建(附性能调优技巧)
阿里云轻量应用服务器上5分钟构建高可用EMQ X MQTT集群 物联网应用的爆发式增长让MQTT协议成为设备连接的首选方案。对于需要处理海量设备连接的企业开发者而言,单节点MQTT服务器早已无法满足高并发和容灾需求。本文将带你在阿里云轻量应用服务器上快速部署EMQ X集群…...
避开版本坑!用DINOv2和MMSegmentation在PASCAL VOC 2012上跑通语义分割(附完整环境配置)
避开版本坑!用DINOv2和MMSegmentation在PASCAL VOC 2012上跑通语义分割(附完整环境配置) 语义分割作为计算机视觉领域的核心任务之一,其技术演进始终与深度学习框架的生态紧密相连。当Meta开源的DINOv2遇上OpenMMLab的MMSegmentat…...
