首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

裝飾器模式深度解析:從核心原理到 Java I/O 體系實戰應用

     編輯:Java 綜合教學

什麼是裝飾器模式?

裝飾器模式屬於結構型設計模式,其核心思想是動態地為物件新增職責,且不改變其介面。相較於繼承產生大量子類別(子類別爆炸),裝飾器以組合取代繼承,將「核心功能」與「額外功能」分離,實現靈活擴展與高內聚。

四大核心角色

  • Component(抽象組件):定義被裝飾者與裝飾者的共同介面
  • Concrete Component(具體組件):被裝飾的核心物件
  • Decorator(抽象裝飾者):持有 Component 參考,實作 Component 介面
  • Concrete Decorator(具體裝飾者):實作具體的附加功能

實戰範例:動態生成針對性履歷

場景:同一份基礎履歷,投遞不同公司需突顯不同技能。用繼承會產生 `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();
    }
}

執行結果示意圖

裝飾器模式的核心優勢

  • 防止子類別爆炸:N 個裝飾器可自由排列組合,理論組合數達 N!
  • 符合開閉原則:新增功能只需新增裝飾類,無需修改既有程式碼
  • 高內聚、低耦合:每個裝飾者只關注單一職責
  • 執行期動態組合:可隨時調整裝飾順序與層數

Java I/O 體系中的經典應用

Java I/O 是裝飾器模式的教科書級應用:

  • InputStream/OutputStream 為 Component
  • FileInputStream 等為 Concrete Component
  • FilterInputStream 為抽象 Decorator
  • BufferedInputStream、DataInputStream、GZIPInputStream 等為 Concrete Decorator
// 典型鏈式裝飾:檔案 -> 緩衝 -> 資料型別讀取
new DataInputStream(new BufferedInputStream(new FileInputStream("data.bin")));

每一層裝飾只負責單一功能(緩衝、壓縮、資料轉換),任意組合無需修改原始類別。

裝飾器 vs 適配器:關鍵差異

維度裝飾器適配器
目的增強功能、保持介面轉換介面、相容舊系統
介面變化維持原介面改變為目標介面
關係is-a(繼承 Component)通常無繼承關係
層疊性支援多層嵌套通常單層包裝

適用場景總結

  • 需在不影響其他物件的情況下,動態為單一物件新增職責
  • 無法使用繼承(如類別為 final、或會導致子類別膨脹)
  • 功能需可撤銷、可重新排序組合
  • Java I/O、Java Servlet Filter、Spring AOP 代理鏈等框架底層廣泛採用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved