桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象和实现解耦,使它们可以独立变化,从而能够更好地组合。
桥接模式将一个类的抽象部分与它的实现部分分离,利用组合的方式,可以让抽象部分和实现部分可以独立地变化,从而达到让两者可以自由的拼合的效果。
举个例子,假设我们有一个车的抽象类,包含了一些公共的行为和属性,而这个车会有不同的品牌,比如Benz, BMW等等。如果我们要在不同的品牌之间进行组合,如果直接使用继承的方式,就需要针对每一个品牌都去实现一个Car的子类,这样就会导致类的数量爆炸性增长,管理和维护都会变得非常困难。
使用桥接模式,我们可以将品牌和车的类进行分离,将品牌作为一个实现部分,车作为一个抽象部分,这样就可以在运行时动态地组合不同的品牌和车的实现,而不需要改变类的数量,这样就可以更灵活地进行搭配。
下面是使用Java实现桥接模式的例子:
public interface Make {
public void setMake();
}
public class Benz implements Make {
@Override
public void setMake() {
System.out.println("制造奔驰车");
}
}
public class BMW implements Make {
@Override
public void setMake() {
System.out.println("制造宝马车");
}
}
public abstract class Car {
protected Make make;
public Car(Make make) {
this.make = make;
}
public abstract void manufacture();
}
public class Sedan extends Car {
public Sedan(Make make) {
super(make);
}
@Override
public void manufacture() {
System.out.print("制造小轿车,");
make.setMake();
}
}
public class SUV extends Car {
public SUV(Make make) {
super(make);
}
@Override
public void manufacture() {
System.out.print("制造SUV,");
make.setMake();
}
}
public class BridgePatternDemo {
public static void main(String[] args) {
Make benz = new Benz();
Car sedan = new Sedan(benz);
Car suv = new SUV(benz);
sedan.manufacture();
suv.manufacture();
}
}
在这个例子中,我们定义了一个Make接口,表示品牌类型,其中Benz和BMW分别实现这个接口;定义了一个抽象类Car作为抽象部分,其中含有一个Make类型的实例,表示在使用车辆时选择的品牌,Sedan和SUV分别实现这个抽象类,表示不同类型的车辆;最后在BridgePatternDemo类中展示了如何创建品牌和车辆的实例,并调用了车辆的manufacture方法,这样就实现了动态组合。’
桥接模式的使用场景和作用包括:
-
在不同维度扩展时使用:当一个类有多个变化的维度时,使用继承会导致类爆炸,使用桥接模式可以将这些维度分离到不同的维度层级结构中进行扩展。例如上面介绍的品牌和车型的例子,两者属于不同的维度,使用桥接模式可以把它们分开,方便扩展。
-
在抽象类和具体实现之间松耦合时使用:当一个抽象类有多个实现时,使用桥接模式可以将这些实现独立起来,使它们更加松耦合,易于维护和扩展。