桥梁模式

我们以电脑分类为例进行展开,电脑分为台式机,笔记本,平板等,每种类型又分好多个品牌,如下图所示

image

现在有如下两个需求:

  1. 我们要增加一个品牌三星
  2. 我们要增加一个分类智能手机

需求1的解决方案:我们在台式机,笔记本,平板电脑分类下都添加相应的子类,三星台式机,三星笔记本...

需求2的解决方案:我们在电脑下面添加子类智能手机,然后这个子类下添加各个品牌分类

发现问题:类的个数急速膨胀,管理成本很高,我们意识到用继承来实现是不行的,因为违反了单一职责原则,一个类联想台式机,却有两个引起这个类变化的原因,类型和品牌

类型维度有自己的一套继承结构,品牌维度也有自己的一套继承结构,然后中间有座桥(Bridge)把这两个类关联起来.这样在添加类型时只需在类型维度做修改就好了, 不会影响到品牌维度;当在品牌维度搞活动时,类型维度也不受影响.桥一端的变化不会引起另一端的变化,这就是桥接模式:

我们对上面类型进行修改

image

下面是实现过程

品牌维度

public abstract class Brand {
  //品牌
  protected abstract String brand();
}
public class Lenovo extends Brand {
  @Override
  protected String brand() {
    return "联想";
  }
}
public class Dell extends Brand {
  @Override
  protected String brand() {
    return "戴尔";
  }
}

类型维度

通过构造函数进行桥梁关联

public abstract class Computer {

  //这里就相当于是“桥梁”
  private Brand brand;

  public Computer(Brand brand) {
    this.brand = brand;
  }

  protected abstract String type();

  public void sale() {
    System.out.println("我们卖的是"+brand.brand() + this.type() +"电脑");
  }
}
public class Desktop extends Computer {

  public Desktop(Brand brand) {
    super(brand);
  }

  @Override
  protected String type() {
    return "台式机";
  }
}
public class Laptop extends Computer {

  public Laptop(Brand brand) {
    super(brand);
  }

  @Override
  protected String type() {
    return "笔记本";
  }
}

客户端

public class Client {
  public static void main(String[] args) {
    Desktop desktop = new Desktop(new Dell());
    desktop.sale();
  }
}

此时,如果我们要添加一个智能手机分类可以这样做

public class Smartphone extends Computer {
  public Smartphone(Brand brand) {
    super(brand);
  }

  @Override
  protected String type() {
    return "智能手机";
  }
}

客户端代码

public class Client {
  public static void main(String[] args) {
    Smartphone smartphone = new Smartphone(new Lenovo());
    smartphone.sale();
  }
}

小结

  • 桥接模式可以取代多层继承的方案,多层继承违背了单一职责原则,复用性较差,类的个数过多,桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
  • 桥接模式极大的提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开放封闭原则
posted @ 2021-08-30 14:47  hejiancao  阅读(60)  评论(0)    收藏  举报