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

Java 裝飾器模式:動態擴展職責的優雅之道

     編輯:Java 相關知識

本文原內容為空,此處提供裝飾器模式核心解析:

模式定義

裝飾器模式:動態地給對象添加額外職責,靈活替代繼承實現功能擴展。符合開閉原則:對擴展開放,對修改關閉。

核心角色

  • Component(抽象組件):定義公共介面
  • ConcreteComponent(具體組件):被裝飾的核心對象
  • Decorator(抽象裝飾器):持有 Component 引用,實現 Component 介面
  • ConcreteDecorator(具體裝飾器):添加具體功能

經典案例:Java I/O 流


// Component: InputStream (抽象類)
// ConcreteComponent: FileInputStream (節點流)
// Decorator: FilterInputStream (處理流基類)
// ConcreteDecorator: BufferedInputStream, DataInputStream, GZIPInputStream...

// 組合使用:文件 → 緩衝 → 數據類型讀取 → 解壓
InputStream in = new DataInputStream(
    new BufferedInputStream(
        new GZIPInputStream(
            new FileInputStream("data.gz"))));
in.readInt(); // 享受緩衝、數據類型、解壓多重功能

代碼結構


interface Coffee { double cost(); String desc(); }
class Espresso implements Coffee { 
    public double cost() { return 10; } 
    public String desc() { return "濃縮咖啡"; } 
}
abstract class CoffeeDecorator implements Coffee {
    protected Coffee coffee;
    public CoffeeDecorator(Coffee coffee) { this.coffee = coffee; }
    public double cost() { return coffee.cost(); }
    public String desc() { return coffee.desc(); }
}
class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee c) { super(c); }
    public double cost() { return super.cost() + 2; }
    public String desc() { return super.desc() + ", 加奶"; }
}
class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(Coffee c) { super(c); }
    public double cost() { return super.cost() + 1; }
    public String desc() { return super.desc() + ", 加糖"; }
}
// 使用
Coffee coffee = new SugarDecorator(new MilkDecorator(new Espresso()));
// cost=13, desc="濃縮咖啡, 加奶, 加糖"

裝飾器 vs 繼承 vs 代理

維度繼承裝飾器代理
關係is-a (靜態)has-a (動態組合)has-a (控制訪問)
擴展方式子類化運行時包裹運行時包裹
目的復用/特化增強功能控制/代理
層級單層多層疊加單層

適用場景

  • 需要動態添加/移除功能(如 GUI 組件邊框、滾動條)
  • 功能組合爆炸,繼承導致類數量失控
  • 無法繼承的最終類 (final) 需擴展

總結

裝飾器模式是組合優於繼承的教科書級應用。Java I/O、Collections.synchronizedList、Spring TransactionInterceptor 皆為經典實踐。**核心思想:薄包裹、厚功能、任意疊加**。

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