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

Java 設計模式之裝飾器模式深度解析:動態擴展職責、IO 流經典實踐、最佳實戰指南

     編輯:Java 相關知識

模式定義

裝飾器模式:動態地給一個對象添加額外職責。就增加功能而言,裝飾器模式比生成子類更為靈活。別名:包裝器模式。

  • 核心思想:組合 > 繼承。通過持有被裝飾對象引用,在調用前後織入增強邏輯,對客戶端透明。
  • 適用場景:需要在不修改原類、不使用繼承的情況下擴展對象功能;功能可自由組合、層疊 (如 IO 流、日誌增強、權限校驗、壓縮加密)。

角色結構

角色說明IO 流對應示例類
Component (抽象構件)定義對象接口,規範核心行為InputStream / OutputStream / Reader / WriterComponent 接口
ConcreteComponent (具體構件)被裝飾的基礎對象FileInputStream / FileOutputStreamConcreteComponent
Decorator (抽象裝飾器)持有 Component 引用,實現 Component 接口,委派調用FilterInputStream / FilterOutputStreamDecorator 抽象類
ConcreteDecorator (具體裝飾器)具體增強邏輯 (緩衝、轉換、壓縮、加密...)BufferedInputStream / DataInputStream / GZIPInputStream / CipherInputStreamConcreteDecoratorA/B

代碼實現 (經典結構)

1. 抽象構件

public interface Component {
    void doSomething();
}

2. 具體構件

public class ConcreteComponent implements Component {
    @Override
    public void doSomething() {
        System.out.println("核心功能 A");
    }
}

3. 抽象裝飾器

public abstract class Decorator implements Component {
    protected final Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void doSomething() {
        component.doSomething(); // 委派
    }
}

4. 具體裝飾器 A (功能 B)

public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void doSomething() {
        super.doSomething(); // 執行核心/上層裝飾邏輯
        doAnotherThing();    // 新增功能 B
    }

    private void doAnotherThing() {
        System.out.println("增強功能 B");
    }
}

5. 具體裝飾器 B (功能 C)

public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void doSomething() {
        super.doSomething();
        doAnotherThing(); // 新增功能 C
    }

    private void doAnotherThing() {
        System.out.println("增強功能 C");
    }
}

6. 客戶端組裝

public class Client {
    public static void main(String[] args) {
        // 從內向外層層包裝:核心 -> 功能 C -> 功能 B
        Component component = new ConcreteDecoratorA(
                new ConcreteDecoratorB(
                        new ConcreteComponent()
                ));
        component.doSomething();
        // 輸出順序:
        // 核心功能 A
        // 增強功能 C
        // 增強功能 B
    }
}

裝飾器 vs 繼承 對比

維度繼承裝飾器
綁定時間編譯期靜態運行期動態
功能組合單一繼承鏈,排列組合爆炸任意組合、層疊、移除
擴展性違反開閉原則 (修改父類/子類)符合開閉原則 (新增裝飾器類)
對象身份子類即父類裝飾器非被裝飾對象 (instanceof 需謹慎)
代碼複雜度類數量少,但層次深類數量多 (每功能一類),結構扁平

Java IO 體系:裝飾器模式教科書級應用

// 輸入流鏈:文件 -> 緩衝 -> 數據類型讀取 -> 對象反序列化
InputStream is = new FileInputStream("data.bin");
is = new BufferedInputStream(is);      // 增強:緩衝讀取,減少系統調用
is = new DataInputStream(is);          // 增強:按基本類型讀取 (readInt/readUTF)
is = new ObjectInputStream(is);        // 增強:對象反序列化
Object obj = is.readObject();

// 輸出流鏈:文件 -> 緩衝 -> GZIP 壓縮 -> 加密
OutputStream os = new FileOutputStream("data.gz.enc");
os = new BufferedOutputStream(os);     // 緩衝
os = new GZIPOutputStream(os);         // 壓縮
os = new CipherOutputStream(os, cipher); // 加密
os.write(data);

每一層裝飾器只關注單一職責,客戶端按需組裝,極致體現「單一職責原則」與「開閉原則」。

實戰最佳實踐

  1. 保持接口單一:Component 接口盡量精簡,避免「胖接口」導致裝飾器實現負擔過重。
  2. 抽象裝飾器可選:若無公共委派邏輯,可直接讓具體裝飾器實現 Component 接口,減少層級。
  3. 避免過度裝飾:超過 3-4 層裝飾會增加調試難度 (堆疊跡深、對象圖複雜),考慮合並相關功能或改用攔截器/切面。
  4. 狀態隔離:裝飾器不應修改被裝飾對象內部狀態,增強邏輯盡量無狀態或維護自身狀態。
  5. Spring 中的應用:@Decorator / BeanPostProcessor / AOP 代理本質均為裝飾器模式變體。

常見變體

  • 透明裝飾器:客戶端完全不知情,接口完全一致 (標準形式)。
  • 半透明裝飾器:裝飾器新增額外方法,客戶端需強轉調用 (違反接口隔離,慎用)。
  • 函數式裝飾器 (JDK 8+):利用 Function<T,T> 組合,無需額外類定義。
    Function<String, String> trim = String::trim;
    Function<String, String> upper = String::toUpperCase;
    Function<String, String> decorate = trim.andThen(upper); // 組合
    String result = decorate.apply("  hello  "); // "HELLO"

總結

裝飾器模式以「組合代替繼承」為核心,提供了運行期動態擴展對象功能的強大能力。Java IO 流體系是其最經典實踐,Spring AOP、Servlet Filter、Netty ChannelHandler 等框架級組件均深受其影響。掌握「抽象構件 → 具體構件 → 抽象裝飾器 → 具體裝飾器」四角色結構,理解委派調用與層疊增強機制,即可在業務代碼中靈活應用,構建高內聚、低耦合、易擴展的系統架構。

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