1.Bridge模式
将類的功能層次結構和實作層次結構分離
類的層次結構的兩個作用:
-
增加新的功能
父類擁有基本功能,在子類中增加新的功能。
Something
----|SomethingGood
--------|SomethingBetter
-
增加新的實作
父類聲明抽象方法來定義接口(API),子類實作具體方法來實作接口
AbstractClass
----|ConcreteClass
----|AnotherConcreteClass
1.1 Bridge模式的類圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR9ENJRVTwMmeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxcDO3IDN1EjMzITMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
登場角色:
-
Abstraction(抽象化)
定義了基本功能,類功能層次結構的最頂層
-
RefinedAbstraction(改進後的抽象化)
在Abstraction角色基礎上增加了功能
-
Implementor(實作者)
功能的真正的實作者,位于類實作層次結構的最頂層
-
ConcreteImplementor(具體的實作者)
實作了在Implementor中定義的接口
1.2 示例程式
類一覽表:
名字 | 說明 |
---|---|
Display | 功能層次結構 |
DisplayImpl | 實作層次結構 |
CountDisplay | 擴充了功能層次結構 |
StringDisplayImpl | 一種實作方式 |
Main | 測試類 |
uml類圖
Display類
package xin.ajay.bridge;
public class Display{
private DisplayImpl impl;
public Display(DisplayImpl impl){
this.impl = impl;
}
public void open(){
impl.open();
}
public void print(){
impl.print();
}
public void close(){
impl.close();
}
public final void display(){
open();
print();
close();
}
}
DisplayImpl類
package xin.ajay.bridge;
public abstract class DisplayImpl {
public abstract void open();
public abstract void print();
public abstract void close();
}
CountDisplay類
package xin.ajay.bridge;
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDiplay(int times){
open();
for (int i = 0; i < times; i++) {
print();
}
close();
}
}
StringDisplayImpl類
package xin.ajay.bridge;
public class StringDisplayImpl extends DisplayImpl {
private String msg;
private int width;
public StringDisplayImpl(String msg) {
this.msg = msg;
this.width = msg.getBytes().length;
}
@Override
public void open() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
@Override
public void print() {
System.out.println("|" + msg + "|");
}
@Override
public void close() {
printLine();
}
}
Mian類
package xin.ajay.bridge;
public class Main {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("hello"));
Display d2 = new CountDisplay(new StringDisplayImpl("hello"));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("hello"));
d1.display();
d2.display();
d3.multiDiplay(2);
}
}
結果
+-----+
|hello|
+-----+
+-----+
|hello|
+-----+
+-----+
|hello|
|hello|
+-----+
鳴謝
GoF《設計模式》和結城浩的《圖解設計模式》