裝飾器模式屬於結構型模式,動態地給對象添加額外職責,比生成子類更靈活。它像「油漆工」一樣,在不改變原對象結構的前提下,為其「刷上」新功能(如日誌、緩存、加密、壓縮等)。
BufferedFileReader, CompressedFileReader, BufferedCompressedFileReader...)。Work)。SquarePeg)。DigHoleDecorator, NailBoardDecorator)。// 1. 抽象構件
interface Work { void insert(); }
// 2. 具體構件
class SquarePeg implements Work {
public void insert() { System.out.println("方形樁打入"); }
}
// 3. 抽象裝飾器
abstract class Decorator implements Work {
protected Work work;
public Decorator(Work w) { this.work = w; }
public void insert() { work.insert(); } // 默認委派
}
// 4. 具體裝飾器:挖坑
class DigHoleDecorator extends Decorator {
public DigHoleDecorator(Work w) { super(w); }
@Override public void insert() {
System.out.println("先挖坑...");
super.insert();
}
}
// 5. 具體裝飾器:釘木板
class NailBoardDecorator extends Decorator {
public NailBoardDecorator(Work w) { super(w); }
@Override public void insert() {
super.insert();
System.out.println("再釘木板固定。");
}
}
// 客戶端動態組合
Work peg = new SquarePeg();
peg = new DigHoleDecorator(peg);
peg = new NailBoardDecorator(peg);
peg.insert();
// 輸出:先挖坑... → 方形樁打入 → 再釘木板固定。
Java I/O 是裝飾器模式的教科書級應用:
FileReader fr = new FileReader("a.txt");
BufferedReader br = new BufferedReader(fr); // 添加緩衝
LineNumberReader lr = new LineNumberReader(br); // 添加行號
Reader 是 Component,FileReader 是 ConcreteComponent,BufferedReader/LineNumberReader 是 Decorator。任意組合,無類爆炸。
Jive 論壇的敏感詞過濾、高亮顯示可作為裝飾器動態掛載到消息處理鏈上,實現「即插即用」的過濾策略。
記住:被裝飾者與裝飾器必須實現同一介面,這是透明性的關鍵。