设计模式之桥接模式

桥接模式

桥接模式是的一种对象结构型模式,它将对象的抽象与实现分离,从而可以独立地改变它们,比如我们在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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值