设计模式之桥接模式

来源:互联网 发布:淘宝可以参加哪些活动 编辑:程序博客网 时间:2024/06/01 08:58

桥接模式

桥接模式是的一种对象结构型模式,它将对象的抽象与实现分离,从而可以独立地改变它们,比如我们在JDBC中用到桥接模式,切换不同类型的数据库,只需要切换不同类型的数据库驱动就可以,而不需要改动太多的代码或者配置。

定义
将抽象部分与它的实现部分分离,使它们都可以独立地变化。

使用场景

  1. 如果你不希望在抽象和实现部分采用固定的绑定关系,可以采用桥接模式,来把抽象和实现部分分开,然后在程序运行期间来动态的设置抽象部分需要用到的具体的实现,还可以动态切换具体的实现。
  2. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
  3. 如果希望实现部分的修改,不会对客户产生影响,可以采用桥接模式,客户是面向抽象的接口在运行,实现部分的修改,可以独立于抽象部分,也就不会对客户产生影响了,也可以说对客户是透明的。
  4. 如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。

结构
桥接模式结构图

实现
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。

0 0
原创粉丝点击