分离类的功能层次与实现层次-Bridge模式

129 阅读2分钟

1、引入

Bridge译为桥梁,在设计模式中可以如下理解:

  • 分离类的功能层次和实现层次,使得两者解耦,不在聚集在同一个类中
  • 在功能层次和实现层次间搭建桥梁,使得二者整合后能够完成完整的目标

2、案例

以打印为例子,在某一条件下,可以这样区分打印的功能层次和实现层次:

  • 功能层次:实现先打印首部,再调用主要内容,最后打印结尾。亦可以拓展为先打印首部,再多次打印内容,最后打印结尾。
  • 实现层次:实现字符串打印,首部打印直线,内容打印字符串,尾部打印直线

2.1、功能层次

打印功能:

public class Display {
    private DisplayImpl impl;

    public Display(DisplayImpl impl) {
        this.impl = impl;
    }

    public void open() {
        impl.rawOpen();
    }

    public void print() {
        impl.rawPrint();
    }

    public void close() {
        impl.rawClose();
    }

    public void display() {
        open();
        print();
        close();
    }
}

内容多次打印:

public class CountDisplay extends Display{

    public CountDisplay(DisplayImpl impl) {
        super(impl);
    }

    public void multiDisplay(int times) {
        open();
        for (int i = 0; i < times; i++) {
            print();
        }
        close();
    }
}

2.2、实现层次

抽象接口:

public abstract class DisplayImpl {
    public abstract void rawOpen();
    public abstract void rawPrint();
    public abstract void rawClose();
}

字符串打印实现:

public class StringDisplayImpl extends DisplayImpl{
    private String string;

    public StringDisplayImpl(String string) {
        this.string = string;
    }

    @Override
    public void rawOpen() {
        printLine();
    }

    @Override
    public void rawPrint() {
        System.out.println("|"+string+"|");
    }

    @Override
    public void rawClose() {
        printLine();
    }

    private void printLine() {
        System.out.print("+");
        for (int i = 0; i < string.length(); i++) {
            System.out.print("-");
        }
        System.out.println("+");
    }
}

2.3、测试

编写如下测试类:

public class Main {
    public static void main(String[] args) {
        Display hello_world = new Display(new StringDisplayImpl("Hello World"));
        CountDisplay hello_china = new CountDisplay(new StringDisplayImpl("Hello China"));
        CountDisplay hello_universe = new CountDisplay(new StringDisplayImpl("Hello Universe"));
        hello_world.display();
        hello_china.display();
        hello_universe.display();
        hello_universe.multiDisplay(5);
    }
}

运行结果:

image.png

3、tips

  • Bridge模式的好处在于,当要改变原有功能或是原有实现时,不需要重新编写一个完整的类,只需要改变某一特定功能(或实现),再将其与未改变的功能(或实现)拼接起来即可。
  • 在实现层面本例也用到了Template模式,在具体实现上定义了同意对外接口,这样才能够方便功能层次调用。