类的功能层次结构
现在有一个类,我们想在Something中增加新的功能,会编写一个Something的子类,即SomethingGood,想在SomethingGood上增加新的功能,又会新建一个子类SomethingBetter,这就是类的功能层次结构,随着功能的增多层次加深。
- 父类具有基本功能
- 子类中增加新的功能
类的实现层次结构
抽象类声明了一些抽象方法,定义接口,然后子类负责去实现这些抽象方法。
这里的层次结构并不是用于增加功能,而是用于实现功能任务的分组
- 父类通过声明抽象方法来定义接口
- 子类通过实现具体的方法来实现接口
什么是桥接模式
Bridge的意思是桥梁。桥梁的功能就是将河流两侧连接起来。桥接模式就是指将两样东西连接起来,他们分别是类的功能层次结构和类的实现层次结构。
例子
ps:例子取自https://www.liaoxuefeng.com/wiki/1252599548343744/1281319266943009#0
假设某个汽车厂商生产三种品牌的汽车:Big、Tiny和Boss,每种品牌又可以选择燃油、纯电和混合动力。如果用传统的继承来表示各个最终车型,一共有3个抽象类加9个最终子类:
抽象类Car
package StructuralPattern.BridgeMode;
/**
* 汽车类
*/
public abstract class Car {
public Engine engine;
public Car(Engine engine){
this.engine = engine;
}
public abstract void drive();
}
引擎接口
package StructuralPattern.BridgeMode;
/**
* 引擎
*/
public interface Engine {
void start();
}
修正类(桥接类)
package StructuralPattern.BridgeMode;
/**
* 修正类(桥接Car和Engine)
*/
public abstract class RefinedCar extends Car{
public RefinedCar(Engine engine){
super(engine);
}
@Override
public void drive() {
this.engine.start();
System.out.println("Drive "+getBrand()+" car...");
}
public abstract String getBrand();
}
Car子类
/**
* BossCar
*/
public class BossCar extends RefinedCar{
public BossCar(Engine engine){
super(engine);
}
@Override
public String getBrand() {
return "Boss";
}
}
Engine实现类
package StructuralPattern.BridgeMode;
/**
* 混合型引擎
*/
public class HybridEngine implements Engine{
@Override
public void start() {
System.out.println("Start Hybrid Engine...");
}
}
结果
总结
采用传统的继承方法,如果要新增一个品牌,或者加一个新的引擎(比如核动力),那么子类的数量增长更快。为了避免子类数量爆炸,使用桥接模式可以很好的解决这个问题。
从上面例子很容易看出使用桥接模式,可以把汽车和引擎当作两个维度,新增汽车品牌只需增加一个修正类的子类,新增一款引擎也只需要实现引擎接口,使得Car和Engine可以自由变化