裝飾器模式屬於結構型設計模式,其核心思想是動態地為物件新增職責,且不改變其介面。相較於繼承產生大量子類別(子類別爆炸),裝飾器以組合取代繼承,將「核心功能」與「額外功能」分離,實現靈活擴展與高內聚。
場景:同一份基礎履歷,投遞不同公司需突顯不同技能。用繼承會產生 `ResumeForAli`、`ResumeForTencent` 等大量子類;裝飾器只需組合即可。
// Component
abstract class Component { public abstract void print(); }
// Concrete Component
class Resume extends Component {
@Override public void print() {
System.out.println("Name: Alex\nMajor: CS\nUniversity: NTU");
}
}
// Decorator
abstract class Decorator extends Component {
protected Component component;
public Decorator(Component c) { this.component = c; }
@Override public void print() { component.print(); }
}
// Concrete Decorators
class AliDecorator extends Decorator {
public AliDecorator(Component c) { super(c); }
@Override public void print() { super.print(); System.out.println("Target: Alibaba, Java"); }
}
class TencentDecorator extends Decorator {
public TencentDecorator(Component c) { super(c); }
@Override public void print() { super.print(); System.out.println("Target: Tencent, C++"); }
}
// Client
public class Demo {
public static void main(String[] args) {
Component base = new Resume();
Component ali = new AliDecorator(base);
Component tx = new TencentDecorator(base);
ali.print(); System.out.println("---"); tx.print();
}
}

Java I/O 是裝飾器模式的教科書級應用:
InputStream/OutputStream 為 ComponentFileInputStream 等為 Concrete ComponentFilterInputStream 為抽象 DecoratorBufferedInputStream、DataInputStream、GZIPInputStream 等為 Concrete Decorator// 典型鏈式裝飾:檔案 -> 緩衝 -> 資料型別讀取
new DataInputStream(new BufferedInputStream(new FileInputStream("data.bin")));
每一層裝飾只負責單一功能(緩衝、壓縮、資料轉換),任意組合無需修改原始類別。
| 維度 | 裝飾器 | 適配器 |
|---|---|---|
| 目的 | 增強功能、保持介面 | 轉換介面、相容舊系統 |
| 介面變化 | 維持原介面 | 改變為目標介面 |
| 關係 | is-a(繼承 Component) | 通常無繼承關係 |
| 層疊性 | 支援多層嵌套 | 通常單層包裝 |