【Java设计模式】Bridge模式:在Java中解耦抽象与实现

文章目录

  • 【Java设计模式】Bridge模式:在Java中解耦抽象与实现
    • 一、概述
    • 二、Bridge设计模式的别名
    • 三、Bridge设计模式的意图
    • 四、Bridge模式的详细解释及实际示例
    • 五、Java中Bridge模式的编程示例
    • 六、Bridge模式类图
    • 七、Java中何时使用Bridge模式
    • 八、Java中Bridge模式的实际应用
    • 九、Bridge模式的优点和权衡
    • 十、源码下载

【Java设计模式】Bridge模式:在Java中解耦抽象与实现

一、概述

在Java开发中,设计模式是提高代码质量和可维护性的重要工具。本文将介绍Bridge模式,它是一种结构型设计模式,用于解耦抽象与实现,增强软件系统的灵活性和可扩展性。

二、Bridge设计模式的别名

  • Handle/Body

三、Bridge设计模式的意图

Bridge设计模式是Java中的一种结构模式,它将抽象与其实现解耦,允许两者独立变化。该模式对于开发灵活和可扩展的软件系统至关重要。

四、Bridge模式的详细解释及实际示例

  1. 实际示例
    • 在Java中,Bridge模式常用于GUI框架、数据库驱动程序和设备驱动程序中。例如,一个通用遥控器(抽象)可以通过一致的接口操作各种电视品牌(实现)。
    • 想象一个通用遥控器(抽象)可以操作不同品牌和类型的电视(实现)。遥控器提供了一致的接口来执行诸如打开/关闭、更改频道和调整音量等操作。每个电视品牌或类型都有自己特定的这些操作的实现。通过使用Bridge模式,遥控器接口与电视实现解耦,允许遥控器与任何电视一起工作,无论其品牌或内部工作方式如何。这种分离允许添加新的电视型号而无需更改遥控器的代码,并且可以开发不同的遥控器来与同一组电视一起工作。
  2. 通俗解释
    • Bridge模式是关于优先使用组合而不是继承。实现细节从一个层次结构推到另一个具有单独层次结构的对象。
  3. 维基百科解释
    • Bridge模式是一种用于软件工程的设计模式,旨在“将抽象与其实现解耦,以便两者可以独立变化”。

五、Java中Bridge模式的编程示例

想象一下,你有一件武器可以有各种附魔,你需要将不同的武器与不同的附魔结合起来。你会如何处理这个问题?你会为每个武器创建多个副本,每个副本都有不同的附魔,还是会创建单独的附魔并根据需要将它们应用于武器?Bridge模式使你能够做到后者。

这里我们有Weapon层次结构:

public interface Weapon {void wield();void swing();void unwield();Enchantment getEnchantment();
}
public class Sword implements Weapon {private final Enchantment enchantment;public Sword(Enchantment enchantment) {this.enchantment = enchantment;}@Overridepublic void wield() {LOGGER.info("The sword is wielded.");enchantment.onActivate();}@Overridepublic void swing() {LOGGER.info("The sword is swung.");enchantment.apply();}@Overridepublic void unwield() {LOGGER.info("The sword is unwielded.");enchantment.onDeactivate();}@Overridepublic Enchantment getEnchantment() {return enchantment;}
}
public class Hammer implements Weapon {private final Enchantment enchantment;public Hammer(Enchantment enchantment) {this.enchantment = enchantment;}@Overridepublic void wield() {LOGGER.info("The hammer is wielded.");enchantment.onActivate();}@Overridepublic void swing() {LOGGER.info("The hammer is swung.");enchantment.apply();}@Overridepublic void unwield() {LOGGER.info("The hammer is unwielded.");enchantment.onDeactivate();}@Overridepublic Enchantment getEnchantment() {return enchantment;}
}

这里是单独的Enchantment层次结构:

public interface Enchantment {void onActivate();void apply();void onDeactivate();
}
public class FlyingEnchantment implements Enchantment {@Overridepublic void onActivate() {LOGGER.info("The item begins to glow faintly.");}@Overridepublic void apply() {LOGGER.info("The item flies and strikes the enemies finally returning to owner's hand.");}@Overridepublic void onDeactivate() {LOGGER.info("The item's glow fades.");}
}
public class SoulEatingEnchantment implements Enchantment {@Overridepublic void onActivate() {LOGGER.info("The item spreads bloodlust.");}@Overridepublic void apply() {LOGGER.info("The item eats the soul of enemies.");}@Overridepublic void onDeactivate() {LOGGER.info("Bloodlust slowly disappears.");}
}

下面是两个层次结构的实际应用:

public static void main(String[] args) {LOGGER.info("The knight receives an enchanted sword.");var enchantedSword = new Sword(new SoulEatingEnchantment());enchantedSword.wield();enchantedSword.swing();enchantedSword.unwield();LOGGER.info("The valkyrie receives an enchanted hammer.");var hammer = new Hammer(new FlyingEnchantment());hammer.wield();hammer.swing();hammer.unwield();
}

以下是控制台输出。

The knight receives an enchanted sword.
The sword is wielded.
The item spreads bloodlust.
The sword is swung.
The item eats the soul of enemies.
The sword is unwielded.
Bloodlust slowly disappears.
The valkyrie receives an enchanted hammer.
The hammer is wielded.
The item begins to glow faintly.
The hammer is swung.
The item flies and strikes the enemies finally returning to owner's hand.
The hammer is unwielded.
The item's glow fades.

六、Bridge模式类图

在这里插入图片描述

七、Java中何时使用Bridge模式

考虑在以下情况下使用Bridge模式:

  1. 当你需要避免抽象与其实现之间的永久绑定,例如在运行时必须选择或切换实现时。
  2. 抽象和它们的实现都应该通过子类化进行扩展,允许每个组件独立扩展。
  3. 对抽象实现的更改不应影响客户端,意味着他们的代码不应需要重新编译。
  4. 当你的层次结构中出现大量类时,表明需要将一个对象拆分为两个部分,Rumbaugh将此概念称为“嵌套泛化”。
  5. 当你想在多个对象之间共享一个实现,可能使用引用计数,同时将此细节隐藏在客户端之外,如Coplien的String类所示,其中多个对象可以共享相同的字符串表示。

八、Java中Bridge模式的实际应用

  1. GUI框架,其中抽象是窗口,实现可以是底层的操作系统窗口系统。
  2. 数据库驱动程序,其中抽象是通用数据库接口,实现是特定数据库的驱动程序。
  3. 设备驱动程序,其中抽象是设备无关代码,实现是设备相关代码。

九、Bridge模式的优点和权衡

  1. 优点
    • 解耦接口和实现:Bridge模式通过将接口(高级操作)与实现(低级操作)分离来增强模块化。
    • 提高可扩展性:你可以独立扩展抽象和实现层次结构。
    • 隐藏实现细节:客户端只看到抽象的接口,而不是其实现。
  2. 权衡
    • 增加复杂性:该模式可能会使系统架构和代码复杂化,特别是对于不熟悉该模式的客户端。
    • 运行时开销:额外的抽象层可能会引入性能损失,尽管在实践中通常可以忽略不计。

十、源码下载

Bridge模式示例代码下载

通过本文的介绍,相信大家对Java中的Bridge模式有了更深入的了解。在实际开发中,合理运用Bridge模式可以提高代码的灵活性和可扩展性,同时降低代码的耦合性,为构建高质量的软件系统提供有力支持。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【日记】今天实在太累了(436 字)

正文 今天的工作强度跟之前完全不是一个级别。能不能不要给我找这么多事做,我只想摸鱼摆烂。以后到下一个单位就说自己啥都不会好了,省得一天天全来找我。 忙碌程度上升了一个数量级,一天结束之后完全不想说话。 好想睡觉。 昨晚尝试完成年度…

【Python】Python 函数综合指南——从基础到高阶

文章目录 Python 函数综合指南1. 函数介绍1.1 什么是函数?1.2 定义函数示例:1.3 调用函数1.4 函数参数1.4.1 必需参数1.4.2 默认参数1.4.3 关键字参数1.4.4 可变长度参数 2. Python 内置函数2.1 字符串处理函数示例: 2.2 数学函数示例&#x…

大数据之数据湖Apache Hudi

一、Hudi框架概述 Apahe Hudi (Hadoop Upserts delete and Incrementals) 是Uber主导开发的开源数据湖框架,为了解决大数据生态系统中需要插入更新及增量消费原语的摄取管道和ETL管道的低效问题,该项目在2016年开始开发,并于2017年开源&#…

Memcached:单节点、集群案例;概念、工作原理

目录 案例前置知识点 Memcached 概念 部署场景 Memcached常用架构 流程 Memcached Memcached API 数据存储方式 数据过期方式 LRU Lazy Expiration Memcached缓存机制 Memcached路由算法 求余数hash算法 一致性hash算法 Memcached分布式 案例 单节点Memcach…

mysql数据库--表的操作

目录 1.创建表 2.查看表 3.修改表 对于表的重命名 更改某一列的属性 直接删除某一列 修改某一列的名称: 增加某一列 4.删除表 1.创建表 按照上次的那个创建表的操作,我们创建完成之后首先就是去把这个use一下,即进入到这个表里面去…

1+X 职业技能等级证书面向哪些人群介绍

日前,“大数据应用开发(Python)”职业技能等级证书已开放面向社会人员招生。 什么是1X职业技能等级证书? “1” 学历证书,代表专业,即学历、毕业 “X” 若干职业技能等级证书,是根据…

Linux远程管理—SSH协议

SSH协议是远程连接的安全性协议,该协议可以有效防止远程管理过程中的信息泄漏,是西安传输数据加密,能够防止DNS和IP欺骗,传输数据压缩,加快传输速度。 安全验证方法有口令验证和密钥验证两种实现手段,该协…

微信H5下载文件、微信浏览器无法下载文件解决方案

手机端的微信访问网页的时候,是禁止直接下载文件的 但是IOS端可以预览.txt/.doc/.docx/.xls/xlsx/.pdf等格式的文件,Android端在下载这些格式的文件时,可以唤起 ‘即将离开微信,在浏览器打开’ 提示 所以,根据手机微…

redis面试(二十四)Semaphore锁实现

Semaphore也是redis分布式锁支持的一种,同步组件 之前给大家的讲解的锁,基本上都是同时间只能一个客户端获取这个锁,然后做一些事情,处理完了以后释放锁 Semaphore,信号量,他作为一个锁机制,可以…

java-Mybatis框架02

1.#{} 和${}区别 #{} 是占位符,是采用编译方式向sql中传值,可以防止sql注入,如果往sql中传值,使用#{}${} 是将内容直接拼接到sql语句中,一般不用于向sql中传值,一般用于向sql中动态传递列名。区别&#xff…

OpenCV绘图函数(6)绘制椭圆函数ellipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 画出一个简单的或粗的椭圆弧或者填充一个椭圆扇形。 函数 cv::ellipse 使用更多的参数可以画出椭圆轮廓、填充的椭圆、椭圆弧或填充的椭圆扇形。…

ISO 26262中的失效率计算:SN 29500-3 Expected values for discrete semiconductors

目录 概要 1 基准条件下的失效率 2 失效率转换 2.1 失效率预测模型 2.2 电压应力系数 2.2.1 电压应力系数计算模型 2.2.2 电压应力系数计算 2.3 温度应力系数 2.3.1 温度应力系数计算模型 2.3.2 温度应力系数计算 2.4 漂移灵敏度系数 3 任务剖面应力系数 4 早期失…

【STM32】时钟体系

一、时钟体系 为什么需要时钟? 时钟可以为系统提供精确的定时,比如时间显示,定时器,pwm… 为芯片各功能模块提供工作势能,使能各组管脚工作,如果不使能,管脚无法工作 同步数据传输 给单片机提供一个时…

【使用 Python 进行截图的两种方法】

在 Python 中,可以使用 pyautogui 和 Pillow 进行截图 使用 pyautogui 进行截图时,其提供了方便的函数。例如,使用 pyautogui.screenshot() 函数可以获取整个屏幕的截图,该函数返回一个包含屏幕截图的图像对象。如果不想截取整个…

齐护【百度AI对话】编程系统文心一言大语音模型对话ESP32图形化Mixly编程Scratch编程Arduino

齐护【百度AI对话】编程系统 一、前言 ​ 在这个日新月异的时代,AI的触角已延伸至互联网、金融、医疗、教育等每一个角落,其影响力不容忽视。从日常中的智能推荐到医疗前沿的精准诊断,从定制化教育到智能化的投资策略,AI正以前所…

Xilinx高速接口之GTP

简介 开坑计划中,主要参考ug482 主要讲解结构以及原语 以及时钟路由和一些其他的 GTP_COMMON还好,需要设置的不多,原语也短, GTP_CHANNEL需要设置的东西真多,原语也长 还好有官方参考例程以及自动生成的原语例化 不然…

PDF文件的读取与合并:使用PyPDF2与ReportLab

目录 一、PyPDF2库基础 1.1 PyPDF2简介 1.2 安装PyPDF2 1.3 读取PDF内容 1.4 合并PDF文件 二、ReportLab库基础 2.1 ReportLab简介 2.2 安装ReportLab 2.3 使用ReportLab生成PDF文本 2.4 ReportLab 与 PyPDF2 结合使用 三、注意事项与最佳实践 3.1 文本提取的局限性…

【Linux】初步识操作系统

linux专栏:《Linux入门系列》 系列文章:gdb-调试器初入门(简单版使用) 编辑器vim入门(概念模式转换技巧) 目录 1. 概念 2. 设计操作系统的目的 3. 定位:操作系统负责管理 4. 如何理解管理 …

科研绘图系列:R语言单细胞差异基因四分图(Quad plot)

介绍 在单细胞分析领域,为了探究不同分组间同一细胞类型的基因表达差异,研究者们常采用四分图(Quad Plot)作为分析工具。该图形的横轴代表比较组1,而纵轴代表比较组2。通过这种布局,四分图能够有效地展示两组间共有的差异表达基因,从而为深入理解细胞类型在不同条件下的…

Android 突破边界:解密google Partner机制获取Resource

在 Android 应用开发中,除了可以查找系统中的特定 APK 并获取其信息外,还可以通过 Partner 机制获取 Partner APK 的资源文件,同时这种机制也是一种跨进程的通信方式。本文将进一步探讨这些内容。 1.Partner apk注册特定的action广播 /** M…