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

Java 設計模式:裝飾器模式(Decorator Pattern)深度掌握

     編輯:Java 相關知識

什麼是裝飾器模式?

裝飾器模式屬於結構型模式,動態地給對象添加額外職責,比生成子類更靈活。它像「油漆工」一樣,在不改變原對象結構的前提下,為其「刷上」新功能(如日誌、緩存、加密、壓縮等)。

為什麼不用繼承?

  • 繼承是靜態的,編譯時確定,無法運行時動態組合。
  • 功能變體多時會產生「類爆炸」(如 BufferedFileReader, CompressedFileReader, BufferedCompressedFileReader...)。
  • 違反單一職責:基類混雜核心邏輯與擴展功能。

模式結構

  • Component(抽象構件):定義核心介面(如 Work)。
  • ConcreteComponent(具體構件):被裝飾對象(如 SquarePeg)。
  • Decorator(抽象裝飾器):實現 Component,持有 Component 引用。
  • ConcreteDecorator(具體裝飾器):添加具體功能(如 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 流

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 ForumMessageFilter 案例

Jive 論壇的敏感詞過濾、高亮顯示可作為裝飾器動態掛載到消息處理鏈上,實現「即插即用」的過濾策略。

核心優勢

  • 運行時動態組合:功能像積木一樣疊加。
  • 避免子類爆炸:N 個裝飾器可組合出 2^N 種功能組合。
  • 符合開閉原則:新增裝飾器無需修改原有代碼。

記住:被裝飾者與裝飾器必須實現同一介面,這是透明性的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved