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

 

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让程序飞

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值