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