桥梁模式/Bridge
意图/适用场景:
桥梁模式的意图在于把“抽象”与“实现”解耦合,把强关联转变为弱关联。
所谓强关联,就是在编译时期已经确定的,无法在运行时期改变的关联;所谓弱关联,就是可以动态地确定并且可以在运行时期动态地改变的关联。显然,在Java语言中,继承关系是强关联,而聚合关系是弱关联。
将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改为弱关联。因此,桥梁模式中的所谓解耦合,就是指在一个软件系统的抽象化和实现化之间使用聚合关系而不是继承关系,从而使两者都可以相对独立地变化。
UML:
参与者:
- 抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用。
- 修正抽象化角色(RefinedAbstraction):扩展抽象化角色,改变和修正父类对抽象化的定义。
- 实现化角色(Implementor):实现类的接口,定义实现类的方法。这些方法与抽象化角色所提供的方法不需要相同,甚至可以完全不同。
- 具体实现化角色(ConcreteImplementor):实现化角色的具体实现类。
要点:
桥梁模式的系统中有两个等级结构:
- 由抽象化角色和修正抽象化角色组成的抽象化等级结构。
- 由实现化角色和具体实现化角色所组成的实现化等级结构。
抽象化等级结构是提供给用户或者系统其它部分使用的,是稳定不易变的;而实现化等级结构是可以替换的,比如在不同的环境中,使用不同的实现化,这也正是解耦合的目标。
应用实例:
AWT的Peer架构
Java语言具有跨平台的功能。相同的代码使用AWT库绘制的界面,在不同的操作系统上功能相同,但外观风格不同。这里就应用了桥梁模式,把Java的AWT调用与操作系统native调用有效地解耦合。 在AWT库中的每一个Component的子类都有一个ComponentPeer的子类与之匹配。所有的Component的子类都属于一个等级结构,即抽象化等级结构;而所有的ComponentPeer的子类都属于另一个等级结构,即实现化等级结构。Component类型和ComponentPeer类型通过Toolkit对象相互通信。
示例代码:
[java]
// Source code from file:Abstraction.java
packagedesignPatterns.Bridge;
publicclass Abstraction {
protectedImplementor imp;
publicvoid operation() {
imp.operationImp();
}
}
// Source code from file:ConcreteImplementorA.java
packagedesignPatterns.Bridge;
publicclass ConcreteImplementorA implements Implementor {
publicvoid operationImp() {
System.out.println("ConcreteImplementorA.operationImp()");
}
}
// Source code from file:ConcreteImplementorB.java
packagedesignPatterns.Bridge;
publicclass ConcreteImplementorB implements Implementor {
publicvoid operationImp() {
System.out.println("ConcreteImplementorB.operationImp()");
}
}
// Source code from file:Implementor.java
packagedesignPatterns.Bridge;
publicinterface Implementor {
publicvoid operationImp();
}
// Source code from file:RefinedAbstraction.java
packagedesignPatterns.Bridge;
publicclass RefinedAbstraction extends Abstraction {
publicRefinedAbstraction(String systemType) {
if(systemType.equals("SystemA"))
imp =new ConcreteImplementorA();
elseif (systemType.equals("SystemB"))
imp =new ConcreteImplementorB();
}
publicvoid operation() {
// do some thing
super.operation();
}
}
// Source code from file:User.java
packagedesignPatterns.Bridge;
publicclass User {
publicstatic void main(String[] args) {
Abstraction absA =new RefinedAbstraction("SystemA");
absA.operation();
Abstraction absB =new RefinedAbstraction("SystemB");
absB.operation();
}
}
[/java]