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设计模式 - 桥接模式的主要内容,如果未能解决你的问题,请参考以下文章