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

2024-08-28 14:36

本文主要是介绍【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模式可以提高代码的灵活性和可扩展性,同时降低代码的耦合性,为构建高质量的软件系统提供有力支持。

这篇关于【Java设计模式】Bridge模式:在Java中解耦抽象与实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115042

相关文章

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.