將類的功能層次結(jié)構(gòu)與實(shí)現(xiàn)層次結(jié)構(gòu)分離
Bridge 模式
Bridge 模式的作用是將類的功能層次結(jié)構(gòu)和類的實(shí)現(xiàn)層次結(jié)連接起來贤重。
類的層次結(jié)構(gòu)的兩個(gè)作用:
-
希望增加新的功能時(shí)
父類具有基本功能错维,在子類中增加新的功能反浓。(類的功能層次結(jié)構(gòu))
-
希望增加新的實(shí)現(xiàn)時(shí)
父類通過聲明抽象方法來定義接口任内,子類通過實(shí)現(xiàn)具體方法來實(shí)現(xiàn)接口。(類的實(shí)現(xiàn)層次結(jié))
示例程序
DisplayImpl.java(Implementor)
package bridge;
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
Display.java(Abstraction)
package bridge;
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 final void display() {
open();
print();
close();
}
}
CountDisplay.java(RefinedAbstraction)
package bridge;
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();
}
}
StringDisplayImpl.java(ConcreteImplementor)
package bridge;
public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string) {
this.string = string;
this.width = string.getBytes().length;
}
public void rawOpen() {
printLine();
}
public void rawPrint() {
System.out.println("|" + string + "|");
}
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
Bridge 中登場的角色
-
Abstraction(抽象化)
該角色位于“類的功能層次結(jié)構(gòu)”的最上層牌里。它使用Implementor角色的方法定義了基本的功能颊咬。
-
RefinedAbstraction(改善后的抽象化)
在Abstraction角色的基礎(chǔ)上增加了新的功能的角色。
-
Implementor(實(shí)現(xiàn)者)
該角色位于“類的實(shí)現(xiàn)層次結(jié)構(gòu)”的最上層牡辽。它定義了用于實(shí)現(xiàn)Abstraction角色的接口的方法喳篇。
-
ConcreteImplementor(具體實(shí)現(xiàn)者)
該角色負(fù)責(zé)實(shí)現(xiàn)在Implementor角色中定義的接口。
拓展思路
分開后更容易擴(kuò)展态辛,增加后的功能可以被“所有的實(shí)現(xiàn)”使用麸澜。