参考资料:设计模式—–桥接模式(Bridge Pattern)。一开始我看的是菜鸟教程上的桥接模式,但是它讲的很垃圾,我看了半天没看明白,又查阅了这一篇,终于算是理解桥接模式了。
桥接模式也是一种结构型模式,用来解决软件系统中多维度的变化。假如只有一个维度的变化,我们可以直接重写多个子类来解决。但是如果有两个维度同时变化呢?试想一下,汽车在道路上行驶,汽车有轿车、SUV之分,而道路又分为高速公路、市区道路等等。怎样抽象才能使这两者同时变化而不用修改系统呢?
首先我们来编写道路的抽象。
代码语言:javascript复制public interface Road {
String getName();
}
class HighWayRoad implements Road {
@Override
public String getName() {
return "高速公路";
}
}
class TownStreetRoad implements Road {
@Override
public String getName() {
return "市区公路";
}
}
然后来编写汽车的抽象。
代码语言:javascript复制public abstract class Car {
protected Road road;
protected String car;
public Car(Road road, String car) {
this.road = road;
this.car = car;
}
abstract void drive();
}
class Jeep extends Car {
public Jeep(Road road, String car) {
super(road, car);
}
@Override
public void drive() {
System.out.println(car "on" road.getName());
}
}
class SUV extends Car {
public SUV(Road road, String car) {
super(road, car);
}
@Override
void drive() {
System.out.println(car "on" road.getName());
}
}
最后来运行一下。
代码语言:javascript复制Road highway = new HighWayRoad();
Road street = new TownStreetRoad();
Car jeep = new Jeep(highway, "吉普");
jeep.drive();
Car suv = new SUV(street, "SUV");
suv.drive();
乍看一下桥接模式好像没有什么特别的,我们需要和其他方式比较一下。假设我们不使用桥接模式来实现上面的例子,一种方式就是创建多个子类,分别实现这些接口。为了实现SUV和高速公路与市区道路的组合,我们需要编写两个实现类,分别继承道路和汽车两个接口。对于吉普车同样需要重复这样的工作。
所以这里就体现出了桥接模式的特点:将一个抽象添加到另一个抽象中,也就是使用组合而非继承的方式。这样系统的两个部分就可以分别变化而不会互相影响了。这也正是桥接模式的本意:让抽象和实现分离,两部分可以互相变化而不影响。