GoF设计模式 - 桥接模式

Posted javanbme

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GoF设计模式 - 桥接模式相关的知识,希望对你有一定的参考价值。

前言

桥接(Bridge)是将抽象部分与它的实现部分分离,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 

 

场景

以汽车销售为例 ,会有汽车品牌和汽车类型,如何实现分类销售 ? 我们可以用多继承结构的方式来实现。

按品牌分类实现结构图:

这样实现的话,会存在扩展性问题并且违反了单一职责原则,当我们新添加一个品牌(长安),我们是不是又要在该品牌下增加两种汽车类型呢?假如我们在增加一个汽车类型(混动车),我们就要在各汽车品牌下增加该汽车类型,继续加。继续加……每次增加都会增加若干个类, 使用继承的方式,不管新增一个类型还是新增一个品牌,都会牵扯出另外一个维度的变化。

 

如何解决

 针对上述场景可以通过合成/聚合复用原则来处理,合成(Composition,也有翻译成组合)和聚合(Aggregation)都是关联的特殊种类。

  • 聚合表示一种弱的‘拥有’关系,体现的是A对象可以 包含B对象,但B对象不是A对象的一部分;
  • 合成则是一种强的‘拥 有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

我们可以将汽车品牌和汽车类型分别进行抽象化,让不同品牌和类型分别继承于它们,这样要增加新的品牌或新的类型都不用影响其他类了。

结构图如下:

模式实现

核心要点 : 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。

结构图:

汽车类型抽象类及实现类

public abstract class Car {
    public abstract void saleImpl(String brand);
}
public class fuelCar extends Car{

    @Override
    public void saleImpl(String brand) {
        System.out.println(brand + "燃油车");
    }
}
public class ElectricCar extends Car{

    @Override
    public void saleImpl(String brand) {
         System.out.println(brand + "电动车");
    }
}

汽车品牌抽象类及实现类

public abstract class Brand {
    protected Car car;

    public void setCar(Car car){
        this.car = car;
    }

    public abstract void sale();
}
public class AuspiciousBrand extends Brand{

    @Override
    public void sale() {
        car.saleImpl("吉利");
    }
}
public class GreatWallBrand extends Brand{

    @Override
    public void sale() {
        car.saleImpl("长城");
    }
}

测试类

@SpringBootTest
class BridgingDemoApplicationTests {

	@Test
	void contextLoads() {
		Brand brand  = new AuspiciousBrand();
		brand.setCar(new ElectricCar());
		brand.sale();
	}

}

运行结果

 

 

模式优缺点

优点 

  • 分离抽象接口及其实现部分
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  • 实现细节对客户透明,隐藏实现细节。

缺点

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

 

源码

https://download.csdn.net/download/javanbme/19124805

 

以上是关于GoF设计模式 - 桥接模式的主要内容,如果未能解决你的问题,请参考以下文章

GoF 23 种设计模式之适配器模式和桥接模式

GoF设计模式 - 桥接模式

Gof 设计模式

设计模式GOF23大纲

GOF23汇总

在GoF设计模式