桥梁(Bridge)模式:
一、桥梁模式的用意
桥梁模式的用意是:将抽象化与实现化脱耦,使得二者可以独立地变化。
1、抽象化
存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样
的实体对待。
2、实现化
抽象化给出的具体实现就是实现化。
一个类的实例就是这个类的实现化,一个具体子类是它的抽象超类的实现化。而在更加复杂的情况下,实现化也可以是与抽象化
等级结构相平行的等级结构,同样可以由抽象类和具体类组成。
3、脱耦
所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是脱耦。
在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。
所谓强关联,就是在编译时期已经确定的,无法在运行时期动态改变的关联;
所谓弱关联,就是可以动态地确定并且可以在运行时期动态改变的关联。
在java中,继承关系是强关联,而聚合关系是弱关联。
因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,
从而使两者可以相对独立地变化。这就是桥梁模式的用意。
二、一个制造飞机的系统例子
//抽象化角色类
public abstract class Airplace{
public abstract void fly();
protected AirplaceMaker airplaneMaker;
}
//修正化抽象角色(载客飞机)
public class PassengerPlane extends Airplane{
public void fly(){
//...........
}
}
//修正化抽象角色(载货飞机)
public class CargoPlane extends Airplane{
public void fly(){
//................
}
}
//实现化角色(飞机制造商)
public abstract class AirplaneMaker{
public abstract void produce();
}
//具体实现化类
public class Airbus extends AirplaneMaker{
public void produce(){
//...........
}
}
public class Boeing extends AirplaneMaker{
public void produce(){
//...........
}
}
public class MD extends AirplaneMaker{
public void produce(){
//...........
}
}
三、在什么情况下使用桥梁模式
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2、设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3、一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4、虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。