目录
1. 桥接模式
- 1. 桥接模式
- 1.1 定义、优缺点、适用场景
- 1.2 模式的结构与实现
重要:桥接模式的核心是遵循合成复用原则,同时满足依赖倒置原则和里氏替换原则。最终实现开闭原则
汽车按“动力源”划分可分为汽油汽车、电动汽车等;按“颜色”划分可分为白色汽车、黑色汽车和红色汽车等。这种具有多个变化维度的类,就可以使用桥接模式
1.1 定义、优缺点、适用场景定义:将抽象与实现分离,使它们可以独立变化。用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度
优点:
- 抽象与实现分离,扩展能力强
- 符合开闭原则
- 符合合成复用原则
- 其实现细节对客户透明
缺点: 由于聚合关系建立在抽象层,要求开发者能识别出各个独立变化维度的抽象层,增加了系统的理解与设计难度
适用场景:
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时
结构:
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。即颜色
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。比如白色
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。即汽车
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。比如汽油汽车
实现:
public class BridgeTest {
public static void main(String[] args) {
Color color = new WhiteColor();
Car car = new PetrolCar(color);
car.printCarInfo();
}
}
// 实现化角色: 颜色
interface Color {
public String getColor();
}
// 具体实现化角色: 白色
class WhiteColor implements Color {
public String getColor() {
return "白色";
}
}
// 抽象化角色:汽车
abstract class Car {
protected Color color;
protected Car(Color color) {
this.color = color;
}
public abstract void printCarInfo();
}
// 扩展抽象化角色: 汽油汽车
class PetrolCar extends Car {
public PetrolCar(Color color) {
super(color);
}
public void printCarInfo() {
System.out.println("这是一辆汽油汽车,颜色为:" + this.color.getColor());
}
}
运行程序,结果如下:
这是一辆汽油汽车,颜色为:白色