1.桥梁模式
桥梁模式是对象的结构模式。用意是:将抽象化与实现化脱耦,使得二者可以独立地变化。
抽象化是指对对于多个实体抽象出普遍的共性,可以把不同实体当做同样的实体对待。Java中一般接口或者抽象类来表示这种抽象实体。
实现化,针对抽象化实体的具体实现。
这里的脱耦是指,将强关联的继承关系变为弱关联的聚合关系。继承关系在编译器就固定了结构,不如聚合灵活。
2.桥梁模式的结构
结构图如下:
Abstracttion:抽象化角色,抽象层的定义,并保存一个Implementor的引用,所以Java中一般用抽象类定义。
RedefinedAbstraction:扩展抽象化角色,修改或者扩展抽象化的定义。
Implementor:实现化抽象角色,定义了实现化角色的接口,使得在抽象化角色中可以同样使用所有的具体实现化角色。实现化角色一般提供底层接口,而抽象化角色在此基础上实现高层操作。
ConcreteImplementor:具体实现化角色。
3.桥梁模式的适用场景
(1)你不希望在抽象和它的实现部分之间有一个固定的绑定关系,期待更加灵活的实现关系。 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
(2)类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。 这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
(3)对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
(4)你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
4.一个实例
(1)问题:
Airbus、Boeing和MD都是飞机制造商,他们都生产载客飞机(Passenger Plane)和载货飞机(Cargo Plane)。需要描述这些飞机制造商以及他们所制造的飞机种类。飞机和制造商的关系可以看做实现的关系,而飞机和制造商都需要可以独立变化的,适合使用桥接模式。
(2)类图:
(3)代码
Airplane.java(抽象化角色)
package com.patterns.bridge;
abstract public class Airplane {
abstract public void fly() ;
public AirplaneMaker getAirplaneMaker() {
return airplaneMaker;
}
public void setAirplaneMaker(AirplaneMaker airplaneMaker) {
this.airplaneMaker = airplaneMaker;
}
/**
* 实现化角色的引用
*/
private AirplaneMaker airplaneMaker;
}
PassengerPlane.java
package com.patterns.bridge;
/**
* 扩展抽象化角色:PassengerPlane
* @author chenxh
*
*/
public class PassengerPlane extends Airplane
{
public void fly()
{
System.out.println(this.getAirplaneMaker().produce()+" CargoPlane is flying!");
}
}
CargoPlane.java
package com.patterns.bridge;
/**
* 扩展抽象化角色:载货飞机
* @author chenxh
*
*/
public class CargoPlane extends Airplane
{
public void fly()
{
System.out.println(this.getAirplaneMaker().produce()+" CargoPlane is flying!");
}
}
AirplaneMaker.java(实现化角色)
package com.patterns.bridge;
abstract public class AirplaneMaker
{
abstract public String produce();
}
Airbus.java
package com.patterns.bridge;
/**
* 具体实现化角色:Airbus
* @author chenxh
*
*/
public class Airbus extends AirplaneMaker
{
public String produce()
{
return "Airbus";
}
}
Boeing.java
package com.patterns.bridge;
/**
* 波音飞机,具体实现化角色
* @author chenxh
*
*/
public class Boeing extends AirplaneMaker
{
public String produce()
{
return "Boeing";
}
}
MD.java
package com.patterns.bridge;
/**
* 具体实现化角色:MD
* @author chenxh
*
*/
public class MD extends AirplaneMaker
{
public String produce()
{
return "MD";
}
}
package com.patterns.bridge;
public class Client {
public static void main(String[] args) {
CargoPlane cargoPlane = new CargoPlane();
cargoPlane.setAirplaneMaker(new Boeing());
cargoPlane.fly();
PassengerPlane passengerPlane = new PassengerPlane();
passengerPlane.setAirplaneMaker(new MD());
passengerPlane.fly();
}
}
输出:
Boeing CargoPlane is flying!
MD CargoPlane is flying!