在什么情况下使用桥梁模式:
1如果一个系统需要在构件的抽象化角色和具体角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3一个构件有多于一个的抽象化角色和实现化角色,系统需要他们之间进行动态耦合。
4虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
/**
* +飞机(abstract)<---------------->+飞机制造商(abstract)
* |_载客的飞机(extends) |_空中巴士公司(extends)
* |_运货的飞机(extends) |_波音公司(extends)
* |_麦道公司(extends)
*
*将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的
*强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用
*组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
*
*如果有一种新的飞机类型,直接继承于Airplane就可;
*如果有一个新的飞机生产商,直接继承于AirplaneMaker就可;
*这样就使得系统的扩展性大大的得到提升。
*/
//飞机的的抽象类
abstract public class Airplane {
abstract public void fly();
protected AirplaneMaker airplaneMaker;
public void setAirplaneMaker(AirplaneMaker airplaneMaker){
this.airplaneMaker = airplaneMaker;
}
}
//载客飞机
public class PassengerPlane extends Airplane {
public void fly() {
//write your code here
airplaneMaker.produce();
}
}
//运货的飞机
public class CargoPlane extends Airplane {
public void fly() {
//write your code here
airplaneMaker.produce()
}
}
//******************************************************************************
//飞机制造商的抽象类
abstract public class AirplaneMaker {
abstract public void produce();
}
//空中巴士公司
public class Airbus extends AirplaneMaker {
public void produce() {
//write your code here
}
}
//波音公司
public class Boeing extends AirplaneMaker {
public void produce() {
//write your code here
}
}
//麦道公司
public class MD extends AirplaneMaker {
public void produce() {
//write your code here
}
}
//main
public static void main(String[] args){
//需要得到波音公司生产的运货飞机
AirplaneMaker boeing = new Boeing();
Airplane plane = new CargoPlane();
plane.setAirplaneMaker(boeing);
plane.fly();
}