Java设计模式(十五):桥接设计模式

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

猜你喜欢

转载自blog.csdn.net/qq_21125183/article/details/86065183