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

打印 上一主题 下一主题

主题 574|帖子 574|积分 1722

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

一、概述

在Java开辟中,设计模式是提高代码质量和可维护性的告急工具。本文将介绍Bridge模式,它是一种布局型设计模式,用于解耦抽象与实现,加强软件系统的灵活性和可扩展性。
二、Bridge设计模式的别名



  • Handle/Body
三、Bridge设计模式的意图

Bridge设计模式是Java中的一种布局模式,它将抽象与着实现解耦,允许两者独立变革。该模式对于开辟灵活和可扩展的软件系统至关告急。
四、Bridge模式的详细解释及现实示例


  • 现实示例

    • 在Java中,Bridge模式常用于GUI框架、数据库驱动步伐和装备驱动步伐中。比方,一个通用遥控器(抽象)可以通过一致的接口利用各种电视品牌(实现)。
    • 想象一个通用遥控器(抽象)可以利用不同品牌和类型的电视(实现)。遥控器提供了一致的接口来执行诸如打开/关闭、更改频道和调整音量等利用。每个电视品牌或类型都有自己特定的这些利用的实现。通过使用Bridge模式,遥控器接口与电视实现解耦,允许遥控器与任何电视一起工作,无论其品牌或内部工作方式如何。这种分离允许添加新的电视型号而无需更改遥控器的代码,并且可以开辟不同的遥控器来与同一组电视一起工作。

  • 普通解释

    • Bridge模式是关于优先使用组合而不是继承。实现细节从一个条理布局推到另一个具有单独条理布局的对象。

  • 维基百科解释

    • Bridge模式是一种用于软件工程的设计模式,旨在“将抽象与着实现解耦,以便两者可以独立变革”。

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

想象一下,你有一件武器可以有各种附魔,你需要将不同的武器与不同的附魔结合起来。你会如何处理这个问题?你会为每个武器创建多个副本,每个副本都有不同的附魔,照旧会创建单独的附魔并根据需要将它们应用于武器?Bridge模式使你可以或许做到后者。
这里我们有Weapon条理布局:
  1. public interface Weapon {
  2.     void wield();
  3.     void swing();
  4.     void unwield();
  5.     Enchantment getEnchantment();
  6. }
  7. public class Sword implements Weapon {
  8.     private final Enchantment enchantment;
  9.     public Sword(Enchantment enchantment) {
  10.         this.enchantment = enchantment;
  11.     }
  12.     @Override
  13.     public void wield() {
  14.         LOGGER.info("The sword is wielded.");
  15.         enchantment.onActivate();
  16.     }
  17.     @Override
  18.     public void swing() {
  19.         LOGGER.info("The sword is swung.");
  20.         enchantment.apply();
  21.     }
  22.     @Override
  23.     public void unwield() {
  24.         LOGGER.info("The sword is unwielded.");
  25.         enchantment.onDeactivate();
  26.     }
  27.     @Override
  28.     public Enchantment getEnchantment() {
  29.         return enchantment;
  30.     }
  31. }
  32. public class Hammer implements Weapon {
  33.     private final Enchantment enchantment;
  34.     public Hammer(Enchantment enchantment) {
  35.         this.enchantment = enchantment;
  36.     }
  37.     @Override
  38.     public void wield() {
  39.         LOGGER.info("The hammer is wielded.");
  40.         enchantment.onActivate();
  41.     }
  42.     @Override
  43.     public void swing() {
  44.         LOGGER.info("The hammer is swung.");
  45.         enchantment.apply();
  46.     }
  47.     @Override
  48.     public void unwield() {
  49.         LOGGER.info("The hammer is unwielded.");
  50.         enchantment.onDeactivate();
  51.     }
  52.     @Override
  53.     public Enchantment getEnchantment() {
  54.         return enchantment;
  55.     }
  56. }
复制代码
这里是单独的Enchantment条理布局:
  1. public interface Enchantment {
  2.     void onActivate();
  3.     void apply();
  4.     void onDeactivate();
  5. }
  6. public class FlyingEnchantment implements Enchantment {
  7.     @Override
  8.     public void onActivate() {
  9.         LOGGER.info("The item begins to glow faintly.");
  10.     }
  11.     @Override
  12.     public void apply() {
  13.         LOGGER.info("The item flies and strikes the enemies finally returning to owner's hand.");
  14.     }
  15.     @Override
  16.     public void onDeactivate() {
  17.         LOGGER.info("The item's glow fades.");
  18.     }
  19. }
  20. public class SoulEatingEnchantment implements Enchantment {
  21.     @Override
  22.     public void onActivate() {
  23.         LOGGER.info("The item spreads bloodlust.");
  24.     }
  25.     @Override
  26.     public void apply() {
  27.         LOGGER.info("The item eats the soul of enemies.");
  28.     }
  29.     @Override
  30.     public void onDeactivate() {
  31.         LOGGER.info("Bloodlust slowly disappears.");
  32.     }
  33. }
复制代码
下面是两个条理布局的现实应用:
  1. public static void main(String[] args) {
  2.     LOGGER.info("The knight receives an enchanted sword.");
  3.     var enchantedSword = new Sword(new SoulEatingEnchantment());
  4.     enchantedSword.wield();
  5.     enchantedSword.swing();
  6.     enchantedSword.unwield();
  7.     LOGGER.info("The valkyrie receives an enchanted hammer.");
  8.     var hammer = new Hammer(new FlyingEnchantment());
  9.     hammer.wield();
  10.     hammer.swing();
  11.     hammer.unwield();
  12. }
复制代码
以下是控制台输出。
  1. The knight receives an enchanted sword.
  2. The sword is wielded.
  3. The item spreads bloodlust.
  4. The sword is swung.
  5. The item eats the soul of enemies.
  6. The sword is unwielded.
  7. Bloodlust slowly disappears.
  8. The valkyrie receives an enchanted hammer.
  9. The hammer is wielded.
  10. The item begins to glow faintly.
  11. The hammer is swung.
  12. The item flies and strikes the enemies finally returning to owner's hand.
  13. The hammer is unwielded.
  14. The item's glow fades.
复制代码
六、Bridge模式类图


七、Java中何时使用Bridge模式

思量在以下情况下使用Bridge模式:

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


  • GUI框架,其中抽象是窗口,实现可以是底层的利用系统窗口系统。
  • 数据库驱动步伐,其中抽象是通用数据库接口,实现是特定命据库的驱动步伐。
  • 装备驱动步伐,其中抽象是装备无关代码,实现是装备相关代码。
九、Bridge模式的优点和权衡


  • 优点

    • 解耦接口和实现:Bridge模式通过将接口(高级利用)与实现(低级利用)分离来加强模块化。
    • 提高可扩展性:你可以独立扩展抽象和实现条理布局。
    • 潜伏实现细节:客户端只看到抽象的接口,而不是着实现。

  • 权衡

    • 增加复杂性:该模式可能会使系统架构和代码复杂化,特殊是对于不熟悉该模式的客户端。
    • 运行时开销:额外的抽象层可能会引入性能损失,只管在实践中通常可以忽略不计。

十、源码下载

Bridge模式示例代码下载
通过本文的介绍,相信各人对Java中的Bridge模式有了更深入的相识。在现实开辟中,合理运用Bridge模式可以提高代码的灵活性和可扩展性,同时低沉代码的耦合性,为构建高质量的软件系统提供有力支持。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表