本文聚焦兩大結構型模式:**Bridge**(橋接)與 **Decorator**(裝飾),透過 AWT Peer 架構與 IO 流類庫的經典實作,展示如何分離抽象與實作、動態組合功能。
AWT 提供跨平台視窗抽象,底層調用各作業系統原生控件。**Peer(同位體)** 充當橋接角色:
Component、Button、Menu 等 AWT 類別。ButtonPeer、MenuPeer 等 Peer 介面。
// 抽象層
abstract class Component {
protected ComponentPeer peer; // 橋接參考
public void paint(Graphics g) { peer.paint(g); } // 委派給實作
}
// 實作層
interface ComponentPeer { void paint(Graphics g); }
class WindowsButtonPeer implements ComponentPeer { ... }
class MotifButtonPeer implements ComponentPeer { ... }
Toolkit 建立平台 Peer)。
// 實作層:原子操作
abstract class Reporter {
abstract void addLine(String line);
String getReport() { return header + report + trailer; }
}
class HTMLReporter extends Reporter { void addLine(String l) { report += l + "
\n"; } }
class ASCIIReporter extends Reporter { void addLine(String l) { report += l + "\n"; } }
// 抽象層:高層邏輯
abstract class Report {
protected Reporter reporter;
public Report(Reporter r) { this.reporter = r; }
void addReportItem(Object item) { reporter.addLine(item.toString()); }
String report() { return reporter.getReport(); }
}
class StockListReport extends Report { ... }
InputStream/OutputStream 僅提供基本位元組讀寫。若用繼承增加緩衝、檔案、資料型別轉換等功能,會導致**子類爆炸**(檔案+緩衝、檔案+資料、緩衝+資料...)。
InputStream、OutputStream。FileInputStream、ByteArrayInputStream。FilterInputStream、FilterOutputStream(持有 Component 參考,預設委派)。BufferedInputStream、DataInputStream、LineNumberInputStream。StringBuffer sb = new StringBuffer("sample");
InputStream stream = new LineNumberInputStream(
new BufferedInputStream(
new StringBufferInputStream(sb)
)
);
stream.read(); stream.getLineNumber(); // 同時具備緩衝與行號功能
FilterInputStream/FilterOutputStream 的子類。read()/write() 實作核心邏輯。
VisualComponent textView = new TextView();
Window window = new Window();
window.setContents(
new BorderDecorator(
new ScrollDecorator(textView, 500), 1
)
);
執行時動態增減裝飾,無需修改 TextView 程式碼。
| 模式 | 核心意圖 | 關鍵結構 | 典型場景 |
|---|---|---|---|
| Bridge | 分離抽象與實作,雙向獨立演化 | Abstraction 持有 Implementor 參考 | AWT Peer, JDBC Driver, 報表輸出格式 |
| Decorator | 動態為物件增加職責 | Decorator 持有 Component 參考,遞迴包裹 | IO 流, GUI 裝飾, Spring AOP 攔截器鏈 |