博客信息

桥接模式Bridge(结构模式)

发布时间:『 2019-03-24 04:37』  博客类别:23种设计模式  阅读(657)
  • 术语

    • Bridge:桥接

    • Abstraction:抽象类

    • Implementor:实现

    • concrete:具体的

  • 角色

    • Client 类:桥接模式的调用者

    • Abstraction:维护了 Implementor/ 即它的实现类 ConcreteImplementorA.., 二者是聚合关系,Abstraction充当桥接类

    • xxxAbstraction :抽象的具体子类

    • Implementor :行为实现类的接口

    • ConcreteImplementorA /B:具体行为的实现类A、B

  • 案例

    需求:手机(型号 + 品牌)操作问题;

    完成手机各品牌各型号的项目设计;

    列如:折叠式的华为、小米、Vivo,直立式的华为、小米、Vivo,旋转式的、滑盖的...

    要求该项目设计易于扩展


小李飞刀_设计模式


小李飞刀_设计模式


上图是常见的需求设计方案,非常不便于维护,手机的型号与品牌耦合度太高,当要新增滑盖(Slide)式的手机时,对应的品牌手机也要新增;

接下来我们来看看桥接模式是如何设计的?


小李飞刀_设计模式


package com.javaxl.design.bridge;

/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create  2020-02-22 17:29
* <p>
* 手机型号
*/
public abstract class Abstraction {
  protected Implementor implementor;

  public abstract void call();
}

class Folded extends Abstraction {
  private String name = "折叠式";

  Folded(Implementor implementor) {
      this.implementor = implementor;
  }

  @Override
  public void call() {
      System.out.println(this.implementor.getName() + this.name + "正在通话中");
  }
}

class Upright extends Abstraction {
  private String name = "直立式";

  Upright(Implementor implementor) {
      this.implementor = implementor;
  }

  @Override
  public void call() {
      System.out.println(this.implementor.getName() + this.name + "正在通话中");
  }
}

class Slide extends Abstraction {
  private String name = "滑盖式";

  Slide(Implementor implementor) {
      this.implementor = implementor;
  }

  @Override
  public void call() {
      System.out.println(this.implementor.getName() + this.name + "正在通话中");
  }
}


package com.javaxl.design.bridge;

/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create  2020-02-22 17:29
* 手机品牌
*/
public interface Implementor {
  String getName();
}

class HW implements Implementor{
  private String name = "华为";

  @Override
  public String getName() {
      return name;
  }
}

class Mi implements Implementor{
  private String name = "小米";

  @Override
  public String getName() {
      return name;
  }
}

class Vivo implements Implementor{
  private String name = "Vivo";

  @Override
  public String getName() {
      return name;
  }
}


public class Client {
  public static void main(String[] args) {
      Folded folded = new Folded(new HW());
      folded.call();

      Upright upright = new Upright(new Mi());
      upright.call();

      Slide slide = new Slide(new Vivo());
      slide.call();
  }
}

小李飞刀_设计模式


从结果可以看出来:

使用桥接模式,对该项目进行设计,型号或品牌的扩展,都不会影响另一方;

即手机型号扩展,手机品牌不受影响;手机品牌的上市退市,不会影响到手机型号;

  • 注意事项及细节

    实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本

    注意: 1、桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程 2、桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。

  • 应用

    JDBC的Driver驱动类


总结

  从上面我们可以看到这种方式的实现的好处了,首先如果我们想使用这些元素做其他的事情,我们只需要继承功能层次的类即可,如果我们想增加的新元素,我们只需要修改实现层次的上下两层的方法,然后就可以使用了,这样思路非常清晰,将功能和组成功能的子功能的实现隔离开来,可以随意的组合,便于组件化编程,比如我们将实现层次作为组件,我们只需要使用委托(组合)将我们想要实现的功能托付给实现层次来完成就好了,大大的提高了可重用性。那么到底什么是桥接呢,在哪里体现的?我想大家都知道了,那就是在委托的地方体现了,这就是桥,一座沟通功能层次和实现层次的桥。由此我们也看到,设计模式其实就是为了最大限度的实现代码的可重用性,为此可谓是绞尽脑汁,实现了之后就能够组件化,可移植,可扩展,从而高内聚低耦合,设计模式,我们已经渐渐地感受到了提取的初衷和意义。 



关键字:     设计模式  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有