设计模式15:桥梁模式

桥梁模式(Bridge DP)的定义是:解耦抽象与实现,让两者能够分别变化。
桥梁模式的名字可能有一点费解,为什么是桥而不是别的呢?我个人理解就是像桥一样连接抽象和实现,虽然说感觉哪里怪怪的,不过也找不到更好的说法了。
至于其定义,如果了解策略模式的话应该不会陌生,因为策略模式是解耦实现,运行时切换方法族;桥梁模式就像进阶的策略模式,不仅实现策略可以切换,连实现的载体也能抽象出来然后切换。
举一个例子,《黑暗之魂》中很多武器都是Boss用玩家也能用的,那么这里就有两个抽象层面:一个是主体的抽象,可能是主角或者Boss;另一个是实现的抽象,即武器的各种攻击方式。比起每个组合创建一个对象,用乘法明显减少最终对象的数量。

代码示例:
这个例子中,抽象对应魔法武器,抽象魔法武器的实现(动作)。

抽象类魔法武器,组合一个实现的抽象,规定三个动作:

/**
 * 
 * MagicWeapon
 * 
 */
public abstract class MagicWeapon {

  protected MagicWeaponImpl imp;

  public MagicWeapon(MagicWeaponImpl imp) {
    this.imp = imp;
  }

  public abstract void wield();

  public abstract void swing();

  public abstract void unwield();

  public MagicWeaponImpl getImp() {
    return imp;
  }
}

抽象类,魔法武器实现,包含三个动作的实现方法:

/**
 * 
 * MagicWeaponImpl
 * 
 */
public abstract class MagicWeaponImpl {

  public abstract void wieldImp();

  public abstract void swingImp();

  public abstract void unwieldImp();

}

到这里其实已经比较清楚了,两个类都是抽象类,因此会派生出一些子类,魔法武器子类与魔法武器实现子类,互相之间是解耦的,可以任意搭配,也就是桥梁模式。
为了简单起见,这里只举出一个例子:
本体:

/**
 * 
 * BlindingMagicWeapon
 *
 */
public class BlindingMagicWeapon extends MagicWeapon {

  public BlindingMagicWeapon(BlindingMagicWeaponImpl imp) {
    super(imp);
  }

  @Override
  public BlindingMagicWeaponImpl getImp() {
    return (BlindingMagicWeaponImpl) imp;
  }

  @Override
  public void wield() {
    getImp().wieldImp();
  }

  @Override
  public void swing() {
    getImp().swingImp();
  }

  @Override
  public void unwield() {
    getImp().unwieldImp();
  }

  public void blind() {
    getImp().blindImp();
  }
}

实现,这里继续做了一层抽象,增加一个方法:

/**
 * 
 * BlindingMagicWeaponImpl
 *
 */
public abstract class BlindingMagicWeaponImpl extends MagicWeaponImpl {

  public abstract void blindImp();

}

然后真正的实现类:

/**
 * 
 * Excalibur
 *
 */
public class Excalibur extends BlindingMagicWeaponImpl {

  private static final Logger LOGGER = LoggerFactory.getLogger(Excalibur.class);

  @Override
  public void wieldImp() {
    LOGGER.info("wielding Excalibur");
  }

  @Override
  public void swingImp() {
    LOGGER.info("swinging Excalibur");
  }

  @Override
  public void unwieldImp() {
    LOGGER.info("unwielding Excalibur");
  }

  @Override
  public void blindImp() {
    LOGGER.info("bright light streams from Excalibur blinding the enemy");
  }
}

没错,用咖喱棒闪瞎敌人狗眼!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,993评论 1 15
  • Iterator模式 (迭代器) 一个一个遍历 一个集合类可以遵守 Iterator 协议,并实现一个 Itera...
    SSBun阅读 1,880评论 0 15
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,802评论 18 399
  • 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者...
    RamboLI阅读 775评论 0 1
  • 定义 桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。...
    步积阅读 6,806评论 0 10