桥接模式介绍
桥接模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
优点
抽象与实现分离,扩展能力强
符合开闭原则
符合合成复用原则
缺点
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度
适配器模式的实现
结构
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
应用场景
现在家家都有汽车,汽车又有很多牌子,并且还有很多种发动机(用电,用油的还有混合的)
正常做分类
/纯电的宝马汽车
/奔驰牌汽车-燃油的奔驰汽车
/ \混合的奔驰汽车
/
/ /纯电的宝马汽车
汽车 -宝马牌汽车-燃油的宝马汽车
\混合的宝马汽车
发现只有两个牌子就有六个最终的子类,车子多起来子类会非常的多,我们使用桥接模式,把发动机当作实现化角色分离出来
抽象化角色:车
扩展抽象化角色:不同品牌的车
实现化角色:发动机
具体实现化角色:不同的发动机
public class CarTest {
public static void main(String[] args) {
Car car = new BossCar(new FuelOilEngine());
car.drive();
}
}
//发动机 实现化角色,扩展抽象化角色调用
interface Engine {
void start();
}
//燃油发动机 具体实现化角色, 给实现化角色接口的具体实现
class FuelOilEngine implements Engine{
@Override
public void start() {
System.out.println("这是燃油发动机...");
}
}
//车 抽象化角色里面有一个实现化对象的引用
abstract class Car{
protected Engine engine;
public Car(Engine engine){
this.engine = engine;
}
public abstract void drive();
}
//用油的车 扩展抽象化 扩展父类的业务方法
class BossCar extends Car{
public BossCar(Engine engine) {
super(engine);
}
@Override
public void drive() {
System.out.println("开着奔驰牌子的车...");
this.engine.start();
}
}
输出结果
开着奔驰牌子的车…
这是燃油发动机…
小结
桥接模式通过分离一个抽象接口和它的实现部分,使得设计可以按两个维度独立扩展。