1. 应用场景
假如你正在为一个新的人体工学且友好的电视遥控器编程。你要使用好的OO技能,让所有的遥控器都基于相同的抽象,对此抽象又做出不同的实现—每部不同型号的电视机都有自己的遥控器的实现。
2. 概念
使用桥接设计模式,不只改变你的实现,也改变你的抽象。将抽象与实现分离开来,使它们可以独立变化。
3.Class Diagram
- Abstraction:定义抽象类的接口
- Implementor:定义实现类接口
这两个层次之间的关系就叫做“桥接”。
4. Implementation
public abstract class TV {
public abstract void off();
public abstract void on();
public abstract void tuneChannel();
}
public class Sony extends TV {
@Override
public void on() {
System.out.println("Sony.on()");
}
@Override
public void off() {
System.out.println("Sony.off()");
}
@Override
public void tuneChannel() {
System.out.println("Sony.tuneChannel()");
}
}
public class RCA extends TV {
@Override
public void on() {
System.out.println("RCA.on()");
}
@Override
public void off() {
System.out.println("RCA.off()");
}
@Override
public void tuneChannel() {
System.out.println("RCA.tuneChannel()");
}
}
public abstract class RemoteControl {
protected TV tv;
public RemoteControl(TV tv) {
this.tv = tv;
}
public abstract void on();
public abstract void off();
public abstract void tuneChannel();
}
public class ConcreteRemoteControl1 extends RemoteControl {
public ConcreteRemoteControl1(TV tv) {
super(tv);
}
@Override
public void on() {
System.out.println("ConcreteRemoteControl1.on()");
tv.on();
}
@Override
public void off() {
System.out.println("ConcreteRemoteControl1.off()");
tv.off();
}
@Override
public void tuneChannel() {
System.out.println("ConcreteRemoteControl1.tuneChannel()");
tv.tuneChannel();
}
}
public class ConcreteRemoteControl2 extends RemoteControl {
public ConcreteRemoteControl2(TV tv) {
super(tv);
}
@Override
public void on() {
System.out.println("ConcreteRemoteControl2.on()");
tv.on();
}
@Override
public void off() {
System.out.println("ConcreteRemoteControl2.off()");
tv.off();
}
@Override
public void tuneChannel() {
System.out.println("ConcreteRemoteControl2.tuneChannel()");
tv.tuneChannel();
}
}
5. 优点和缺点
5.1 优点
- 将实现予以解耦,让它和界面之间不再永久绑定。
- 抽象和实现可以独立扩展,不会影响到对方。
- 对于“具体的抽象类”所做的改变,不会影响到客户。
5.2 缺点
- 适合用在需要跨越多个平台的图像和窗口系统上
- 当需要不同的方式改变接口和实现时,你会发现桥接模式很好用。
- 桥接模式的缺点是增加了复杂度。
6. JDK
- AWT (It provides an abstraction layer which maps onto the native OS the windowing support.)
- JDBC