第一节
前言
大家好,周四晚上通宵上线,到了周六才缓过来劲头,感觉是自己上了年纪,之前刚毕业的时候,熬夜通宵第二天一点事情没有,自己的熬夜记录就是两天一夜。真怀念当初通宵上班后,第二天早上下班喝碗胡辣汤配油条、不知疲惫的日子,现在别说早上喝胡辣汤了,真想下班马上泡点枸杞茶补一补,是时候拿出我的保温杯泡点枸杞了。
今天我带来的是结构型模式的第三章—桥接模式的文章,简单的讲述下,设计模式大多可以从模式的名字去分辨这个模式的作用及实现过程,“桥接”一词,可以简单理解为将两个相对重要且需要共同协作的功能进行桥接,使他们配合在一起,完成相关工作,类似网络中的交换机、网桥使用的就是桥接,Java程序中的桥接如何实现呢?请看文章的描述吧。
第二节
桥接模式
桥接模式(Bridge)是将一个类整体中的抽象与实现分离,使它们可以独立变化。桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
主要组成角色
1
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用
2
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
3
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用
4
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
个人理解
一个完整的产品肯定有许多种的属性组成,将这些组成的多个属性中有共同特征的属性进行抽象化,当真正需要组成多种产品时将原有的抽象化进行扩展,完成扩展抽象化过程,然后具体实现化角色使用多种组合的方式进行组合,组合成不同的产品,这个过程就叫桥接模式。例如一个车的抽象方法,需要创建一个汽车对象,需要实现车的品牌、车的颜色、车的形状,但是当系统中增加电动车,同样需要实现品牌、颜色、形状,当车的种类越来越多,每个车型也会有相同的颜色或者品牌,但是每个实例都是独立完成自己的属性赋值,重复的属性赋值无法被复用,传统模式会显得臃肿,抽象模式可以将颜色、品牌等信息抽象化,每个车型生产线将原有抽象进行扩展抽象,来完成具体产品的制造。
场景举例
一个汽车制造工厂,有三条产品线,分别生产汽车、电动汽车、混动汽车,每个车型的颜色都有红、黑、白三种颜色,但是每个产品线都在独自完成本类产品的任务,三条产品线拥有自己的汽车油漆喷涂组,这样每个产品线都有三个颜色的喷涂组,全厂就有了3x3=9个喷涂组,每个产品线的需求量不同,无法完全利用起来。此时引入了桥接模式,成立单独的喷涂组,一共三条喷涂产品线,三条生产线需要喷涂颜色时,送往喷涂组进行颜色喷涂,将喷涂工作进行抽象,然后再给各个产品线使用的过程就是引入了桥接。可以参考这个模式,将多种工种进行抽象,每个产品线自行组合使用的过程的工种,减少臃肿。这里面的喷涂组就是抽象化角色,每个颜色喷涂都代表实现化角色,产品线的工作流程则是扩展抽象化,运行过程中将喷涂组与现有流程结合的人员就叫具体实现化角色。
UML图
第三节
代码实现
1.创建抽象化角色
package com.yang.bridge;
/**
* @ClassName Color
* @Description 抽象化角色
* @Author IT小白架构师之路
* @Date 2020/12/19 16:14
* @Version 1.0
**/
public interface Color {
/**
* 获取颜色
* @return
*/
public String getColor();
}
2.创建抽象化的两个实现化角色Black和Red
package com.yang.bridge;
/**
* @ClassName Black
* @Description 实现化角色
* @Author IT小白架构师之路
* @Date 2020/12/19 16:15
* @Version 1.0
**/
public class Black implements Color{
@Override
public String getColor() {
return "黑色";
}
}
package com.yang.bridge;
/**
* @ClassName Red
* @Description 实现化角色
* @Author IT小白架构师之路
* @Date 2020/12/19 16:15
* @Version 1.0
**/
public class Red implements Color{
@Override
public String getColor() {
return "红色";
}
}
3.创建扩展抽象化角色
package com.yang.bridge;
/**
* @ClassName Car
* @Description 扩展抽象化
* @Author IT小白架构师之路
* @Date 2020/12/19 16:16
* @Version 1.0
**/
public abstract class Car{
//组合颜色对象
protected Color color;
//构造函数
public Car(Color color){
this.color = color;
}
/**
* 产品描述抽象方法
* @return
*/
public abstract String getName();
}
4.创建扩展抽象角色的两个具体实现化角色Automobile和ElectricCar
package com.yang.bridge;
/**
* @ClassName Automobile
* @Description 具体实现化角色(汽车)
* @Author IT小白架构师之路
* @Date 2020/12/19 16:19
* @Version 1.0
**/
public class Automobile extends Car{
//有参构造
public Automobile(Color color){
super(color);
}
@Override
public String getName() {
return "我是颜色为"+super.color.getColor()+"的汽车";
}
}
package com.yang.bridge;
/**
* @ClassName ElectricCar
* @Description 具体实现化角色(电动汽车)
* @Author IT小白架构师之路
* @Date 2020/12/19 16:23
* @Version 1.0
**/
public class ElectricCar extends Car{
//有参构造
public ElectricCar(Color color){
super(color);
}
@Override
public String getName() {
return "我是颜色为"+super.color.getColor()+"的汽车";
}
}
5.创建测试类
package com.yang.bridge;
/**
* @ClassName Cilient
* @Description 客户端
* @Author IT小白架构师之路
* @Date 2020/12/19 16:24
* @Version 1.0
**/
public class Cilient {
public static void main(String[] args) {
//颜色对象
Color color = new Black();
//汽车对象
Car car = new Automobile(color);
System.out.println(car.getName());
//电动汽车对象
color = new Red();
car = new ElectricCar(color);
System.out.println(car.getName());
}
}
6.程序运行结果,通过将颜色对象抽象化,增加扩展抽象化的方式生产不同的产品
我是颜色为黑色的汽车
我是颜色为红色的汽车
第四节
桥接模式优缺点及适用场景
优点:
1. 分离抽象接口及其实现部分,提供了比继承更好的解决方案。
2. 将单个产品线不同维度的属性进行抽象,当其中一个维度的属性需要增加时,不需要改变原有代码,增加了扩展性。
3. 将多个产品线的相同的维度进行了抽象,代码复杂性减少,可做到代码复用性增强。
4. 本文的桥接模式是两个维度进行桥接,当增加多个维度时,可自由组合桥接,但是只能桥接其中两个,但是多个桥接模式组合,可以完成更大的体系。
缺点:
1.桥接模式的使用会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,维护成本增加。
2.桥接模式要求设计者能够正确识别出系统中需要独立变化的两个需要桥接的维度,设计难度增加,且则使用范围也会被局限。
适用场景:
1.一个类存在两个独立的维度,且这两个维度都可以进行扩展时。
2.多个类中通过继承完成的内容相同时,可以对相同的内容进行抽象,减少代码量及系统复杂度。
3.在构件的抽象化角色和具体化角色之间增加更多的灵活性时,使用桥接模式的扩展抽象化角色增加灵活性。