桥接模式
桥接模式是的一种对象结构型模式,它将对象的抽象与实现分离,从而可以独立地改变它们,比如我们在JDBC中用到桥接模式,切换不同类型的数据库,只需要切换不同类型的数据库驱动就可以,而不需要改动太多的代码或者配置。
定义
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
使用场景
- 如果你不希望在抽象和实现部分采用固定的绑定关系,可以采用桥接模式,来把抽象和实现部分分开,然后在程序运行期间来动态的设置抽象部分需要用到的具体的实现,还可以动态切换具体的实现。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
- 如果希望实现部分的修改,不会对客户产生影响,可以采用桥接模式,客户是面向抽象的接口在运行,实现部分的修改,可以独立于抽象部分,也就不会对客户产生影响了,也可以说对客户是透明的。
- 如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。
结构
实现
TV接口与具体类的实现
public interface ITV {
void on();
void off();
void switchChannel(int channel);
}
public class SonyTV implements ITV {
public void on() {
System.out.println("SonyTV has turn on");
}
public void off() {
System.out.println("SonyTV has turn off");
}
public void switchChannel(int channel) {
System.out.println("SonyTV switch to channel "+channel);
}
}
public class SamsungTV implements ITV {
public void on() {
System.out.println("SamsungTV has turn on");
}
public void off() {
System.out.println("SamsungTV has turn off");
}
public void switchChannel(int channel) {
System.out.println("SamsungTV switch to channel "+channel);
}
}
遥控器抽象与具体类的实现
public abstract class AbstractRemoteControl {
private ITV tv;
public AbstractRemoteControl(ITV tv) {
this.tv = tv;
}
protected void turnOn(){
tv.on();
}
protected void turnOff(){
tv.off();
}
protected void setChannel(int channel){
tv.switchChannel(channel);
}
}
public class LogitechRemoteControl extends AbstractRemoteControl {
public LogitechRemoteControl(ITV tv) {
super(tv);
}
public void turnOn(){
super.turnOn();
}
public void turnOff(){
super.turnOff();
}
public void setChannel(int channel){
super.setChannel(channel);
}
}
当我们修改TV接口的具体实现时,对于遥控器类是无感知的,同样的修改遥控器类的具体实现时,对于TV类也是透明的,当然我们也可以很容易的扩充产品,只有实现接口或者继承抽象类。有兴趣的朋友可以查看一下JDBC的代码,可以发现DriverManager类和Driver接口就是桥接关系,因此能实现灵活的扩展,只要产商提供Driver的实现就OK。