当前位置: 首页 > news >正文

桥接模式:连接抽象与实现的设计艺术

桥接模式:连接抽象与实现的设计艺术

在软件开发中,设计模式是帮助我们以优雅的方式解决问题的模板。桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目标是将抽象部分与实现部分分离,这样两者可以独立地变化。这种模式通过创建一个桥接实现,增加了系统的灵活性。在本文中,我们将通过一个简单的示例来探索桥接模式,并提供相关的Java代码,使你能够更好地理解和应用这一模式。

桥接模式简介

桥接模式通过把抽象化(Abstraction)与实现化(Implementation)解耦,使得二者可以独立变化。这个模式涉及到一个作为桥接的接口,它使得具体的类不需要关心抽象类的实现细节。使用桥接模式可以避免在抽象层建立类的层次结构,同时也可以减少子类的生成。

应用场景

当一个系统中角色数目增加时,使用桥接模式可以将它们分离为两个独立的维度,使得系统可以在不增加复杂度的情况下进行扩展。常见的应用场景包括但不限于:

  • 当一个类存在两个独立变化的维度时,可以使用桥接模式使它们在各自的维度上独立扩展。
  • 当希望避免一个类的实现直接绑定到接口上,从而使得实现可以在运行时刻进行配置或切换时。

示例:设备控制程序

假设我们有一系列的设备(如电视、收音机)和一个遥控器,遥控器是设备的抽象,而每个设备的实现细节则是实现。我们希望能够独立地扩展遥控器和设备,而不是将特定的遥控器绑定到特定的设备上。

实现细节接口

首先,我们定义一个实现接口,表示设备的功能。

public interface Device {boolean isEnabled();void enable();void disable();int getVolume();void setVolume(int volume);int getChannel();void setChannel(int channel);
}

具体的设备实现

然后,我们可以为电视和收音机创建具体的实现。

public class Tv implements Device {private boolean on = false;private int volume = 30;private int channel = 1;@Overridepublic boolean isEnabled() {return on;}@Overridepublic void enable() {on = true;}@Overridepublic void disable() {on = false;}@Overridepublic int getVolume() {return volume;}@Overridepublic void setVolume(int volume) {this.volume = volume;}@Overridepublic int getChannel() {return channel;}@Overridepublic void setChannel(int channel) {this.channel = channel;}
}public class Radio implements Device {// Implement similar to Tv but for Radio specifics
}

抽象和桥接

接下来,我们创建一个抽象的遥控器类,它将使用Device接口作为一个桥接。

public abstract class Remote {protected Device device;public Remote(Device device) {this.device = device;}public void togglePower() {if (device.isEnabled()) {device.disable();} else {device.enable();}}public abstract void volumeDown();public abstract void volumeUp();public abstract void channelDown();public abstract void channelUp();
}

具体的遥控器实现

最后

,我们可以根据需要提供遥控器的具体实现。

public class BasicRemote extends Remote {public BasicRemote(Device device) {super(device);}@Overridepublic void volumeDown() {device.setVolume(device.getVolume() - 10);}@Overridepublic void volumeUp() {device.setVolume(device.getVolume() + 10);}@Overridepublic void channelDown() {device.setChannel(device.getChannel() - 1);}@Overridepublic void channelUp() {device.setChannel(device.getChannel() + 1);}
}

使用示例

现在我们可以独立地创建设备和遥控器,并且灵活地组合它们。

public class Demo {public static void main(String[] args) {Device tv = new Tv();Remote remote = new BasicRemote(tv);remote.togglePower();remote.channelUp();remote.volumeUp();// 对于Radio,只需更换设备实例}
}

总结

桥接模式提供了一种强大的机制,允许抽象和实现可以独立变化而不是永久绑定,增加了代码的灵活性和扩展性。通过上述的设备和遥控器的例子,我们看到了如何将抽象(遥控器)与实现(设备)分离,并通过桥接它们。希望这篇博客能帮助你理解桥接模式,并在未来的设计中找到它的应用场景。

相关文章:

桥接模式:连接抽象与实现的设计艺术

桥接模式:连接抽象与实现的设计艺术 在软件开发中,设计模式是帮助我们以优雅的方式解决问题的模板。桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目标是将抽象部分与实现部分分离,这样两者可以…...

C语言——oj刷题——字符串左旋

问题: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 实现: 当我们谈到字符串左旋时,我们指的是将字符串中的字符向左移动一定数量的位置。这个问题在编程中…...

神经网络(Nature Network)

最近接触目标检测较多,再此对最基本的神经网络知识进行补充,本博客适合想入门人工智能、其含有线性代数及高等数学基础的人群观看 1.构成 由输入层、隐藏层、输出层、激活函数、损失函数组成。 输入层:接收原始数据隐藏层:进行…...

【Unity】QFramework通用背包系统优化:使用Odin优化编辑器

前言 在学习凉鞋老师的课程《QFramework系统设计:通用背包系统》第四章时,笔者使用了Odin插件,对Item和ItemDatabase的SO文件进行了一些优化,使物品页面更加紧凑、更易拓展。 核心逻辑和功能没有改动,整体代码量减少…...

基本算法--贪心

1.简述 贪心法的效率非常高,复杂度常常为O(1),是一种局部最优的解题方法,而很多问题都需要求全局最优,,所以在使用贪心法之前需要评估是否能从局部最优推广到全局最优。 2.思路 作为算法的贪…...

13. 串口接收模块的项目应用案例

1. 使用串口来控制LED灯工作状态 使用串口发送指令到FPGA开发板,来控制第7课中第4个实验的开发板上的LED灯的工作状态。 LED灯的工作状态:让LED灯按指定的亮灭模式亮灭,亮灭模式未知,由用户指定,8个变化状态为一个循…...

Python re找到特定pattern并将此pattern重复n次

要找到字符串s中的数字,并将这些数字重复3次: import re s "abc123def456ghi789" # 找到所有的数字 numbers re.findall(r\d, s) # 重复每个数字3次 repeated_numbers [num * 3 for num in numbers] # 将重复的数字放回原位置 #…...

ChatGpt报错:We ran into an issue while authenticating you解决办法

在登录ChatGpt时报错:Oops!,We ran into an issue while authenticating you.(我们在验证您时遇到问题),记录一下解决过程。 完整报错: We ran into an issue while authenticating you. If this issue persists, please contact…...

如何从 iPhone 恢复已删除的视频:简单有效方法

无论您是在尝试释放空间时不小心删除了 iPhone 上的视频,还是在出厂时清空了手机,现在所有数据都消失了,都不要放弃。有一些方法可以恢复这些视频。 在本文中,我们将向您展示六种最有效的数据恢复方法,可以帮助您从 i…...

【python量化交易】qteasy使用教程02 - 获取和管理金融数据

qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并…...

数据库学习案例20240206-ORACLE NEW RAC agent and resource关系汇总。

1 集群架构图 整体集群架构图如下: 1 数据库启动顺序OHASD层面 操作系统进程init.ohasd run启动ohasd.bin init.ohasd run 集群自动启动是否被禁用 crsctl enable has/crsGIHOME所在文件系统是否被正常挂载。管道文件npohasd是否能够被访问, cd /var/t…...

TypeScript 入门

课程地址 ts 开发环境搭建 npm i -g typescript查看安装位置: $ npm root -g C:\Users\Daniel\AppData\Roaming\npm\node_modules创建 hello.ts: console.log("hello, ts");编译 ts 文件,得到 js 文件: $ tsc foo.…...

linux 磁盘相关操作

1.U盘接入虚拟机 (1)在插入u盘时,虚拟机会检测usb设备,在弹出窗口选择连接到虚拟机即可。 (2)或 直接在虚拟机--->可移动设备--->找到U盘---->连接 2.检测U盘是否被虚拟机识别 ls /dev/sd* 查…...

PyTorch: torch.max()函数详解

torch.max函数详解:基于PyTorch的深入探索 🌵文章目录🌵 🌳引言🌳🌳torch.max()函数简介🌳🌳torch.max()的返回值🌳🌳torch.max()的应用示例🌳&am…...

Rust基础拾遗--核心功能

Rust基础拾遗 前言1.所有权与移动1.1 所有权 2.引用3.特型与泛型简介3.1 使用特型3.2 特型对象3.3 泛型函数与类型参数 4.实用工具特型5.闭包 前言 通过Rust程序设计-第二版笔记的形式对Rust相关重点知识进行汇总,读者通读此系列文章就可以轻松的把该语言基础捡起来…...

MySQL:常用指令

MySQL官网 一、在Windows 系统 cmd窗口里执行的命令 启动:net start MySQL停止:net stop MySQL卸载:sc delete MySQL 二、在macOS系统终端里执行的命令 启动:mysql.server start停止:mysql.server stop重启:mysql.server restart 三、执行帮…...

Scrapy:Python中强大的网络爬虫框架

Scrapy:Python中强大的网络爬虫框架 在当今信息爆炸的时代,从互联网上获取数据已经成为许多应用程序的核心需求。Scrapy是一款基于Python的强大网络爬虫框架,它提供了一种灵活且高效的方式来提取、处理和存储互联网上的数据。本文将介绍Scrap…...

linux系统非关系型数据库redis的配置文件

redis配置文件 Redis的配置文件位于Redis安装目录下,文件名为redis.conf,配置项说明如下 Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no当Redis以守护进程方式运行时,Red…...

电力负荷预测 | 基于LSTM、TCN的电力负荷预测(Python)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于LSTM、TCN的电力负荷预测(Python) 源码设计 #------------------...

Java+SpringBoot实习管理系统探秘

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...

从Wi-Fi 6到5G:深入浅出聊聊MIMO中的CSI反馈那些事儿(PMI/RI/CQI详解)

从Wi-Fi 6到5G:深入浅出聊聊MIMO中的CSI反馈那些事儿(PMI/RI/CQI详解) 现代无线通信系统正经历着从Wi-Fi 6到5G的跨越式发展,而多天线技术(MIMO)作为提升频谱效率的核心手段,其性能很大程度上依赖于准确的信道状态信息…...

旧房改造完整施工流程

旧房改造是一项复杂而细致的工程,不仅需要专业的技术,还需要科学合理的规划。以下是旧房改造的完整施工流程,帮助您更好地了解整个过程。一、前期准备1. 现场勘测具体操作:专业人员对房屋进行全面检查,包括墙体老化、漏…...

HDLbits奇偶校验坑点复盘:我如何被Fsm serialdp“折磨”到发邮件问作者?

HDLbits奇偶校验坑点复盘:从状态机类型差异到调试方法论 凌晨三点,显示器上的波形依然和预期不符。这是我第七次重写Fsm serialdp的状态机代码,仿真结果中done信号始终在错误的时间点跳变。作为HDLbits的终极挑战之一,这道串口接收…...

Tina Linux嵌入式系统开发实战:从SDK结构到应用部署全解析

1. 项目概述:从零开始理解 Tina Linux 系统开发如果你正在为一个嵌入式设备寻找一个稳定、开源且高度可定制的操作系统,那么 Tina Linux 很可能已经进入了你的视野。它不是一个凭空出现的全新系统,而是基于 OpenWrt 和 Linux 内核深度定制而来…...

喜马拉雅FM音频下载器:跨平台VIP专辑下载完整指南

喜马拉雅FM音频下载器:跨平台VIP专辑下载完整指南 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 在数字音频内容日益丰…...

别再只盯着硬盘了!Windows内存取证入门:用ProcDump和Strings快速分析可疑进程的Dump文件

Windows内存取证实战:5分钟快速定位可疑进程的蛛丝马迹 当服务器突然卡顿、某个进程CPU占用率飙升时,大多数运维人员的第一反应是打开任务管理器结束进程。但真正的威胁往往隐藏在表象之下——那些看似正常的svchost.exe可能正在悄悄执行恶意代码。本文…...

FlicFlac音频格式转换工具:Windows平台轻量级音频处理终极指南

FlicFlac音频格式转换工具:Windows平台轻量级音频处理终极指南 【免费下载链接】FlicFlac Tiny portable audio converter for Windows (WAV FLAC MP3 OGG APE M4A AAC) 项目地址: https://gitcode.com/gh_mirrors/fl/FlicFlac 还在为不同设备间的音频格式兼…...

别再死记硬背了!一张图搞懂BST、AVL、红黑树的区别与选型

可视化解析:三大树结构的核心差异与工程实践指南 每次面对技术面试中"为什么Java的TreeMap用红黑树而不用AVL树"这类问题时,你是否会感到一阵心虚?作为曾在多个分布式系统中亲手实现过树结构的工程师,我深刻理解这种困…...

Kilim Actor模型实践:构建高并发消息传递系统的终极指南 [特殊字符]

Kilim Actor模型实践:构建高并发消息传递系统的终极指南 🚀 【免费下载链接】kilim Lightweight threads for Java, with message passing, nio, http and scheduling support. 项目地址: https://gitcode.com/gh_mirrors/ki/kilim Kilim是一个强…...

CS188 Note3 学习笔记

更好的阅读体验 Informed Search(启发式搜索) 原文解释 If we have some notion of the direction in which we should focus our search, we can significantly improve performance and “hone in” on a goal much more quickly. This is exactly the focus of informed …...