一.定义
将抽象与实现分离,使他们可以独立变化。其是通过组合关系代替继承,从而降低耦合度。
桥接模式就像一个桥梁,连接两个类,使两个类之间有了关联,但不是通过继承,而是通过组合。
桥接模式是合成复用原则的很好体现。
二.结构
抽象化角色:定义一个抽象类,并包含一个对实现化对象的引用。
扩展抽象化角色:是抽象化角色的实现类,实现了抽象化角色中的具体方法,并通过组合关系调用抽象化角色中的业务方法。
实现化角色:定义实现化角色的接口,供抽象化角色调用
具体实现化角色:给出实现化角色接口的具体实现。
三.案例
下面以汽车为例。汽车有不同的品牌,不同品牌的汽车又有不同的组成(动力源,轮胎,车架等等)。
即对不同品牌的车进行扩展(什么轮胎,什么车架,什么动力源等等)。是各个类的组合。通过继承可以实现,但组合的形式有很多,会导致很多的类。通过桥接模式(合成复用原则)则条理清晰,更加易于扩展。
代码:
/**
* 抽象化角色
*/
public abstract class Car {
//轮胎
protected Tyre tyre;
public Car(Tyre tyre) {
this.tyre = tyre;
}
public abstract void use();
}
public class BYD extends Car{
public BYD(Tyre tyre) {
super(tyre);
}
@Override
public void use() {
tyre.use();
}
}
/**
* 实现化角色
*/
public interface Tyre {
void use();
}
public class GTY implements Tyre{
@Override
public void use() {
System.out.println("使用固特异轮胎");
}
}
好处:
桥接模式能够很好的进行类之间的组合,扩展性也很好,也符合开闭原则。
例如上面的例子,若想新加一个品牌,只需实现其接口就行,不用修改源代码。
四.使用场景
1.当一个类存在两个独立变化的维度,且这两个维度都要进行扩展。
2.当类与类之间需要进行关联(组合),但又不想通过继承来实现。