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

Java 設計模式教學:Decorator 裝飾者模式應用實例解析

     編輯:Java 相關知識

裝飾者模式核心概念

裝飾者模式(Decorator Pattern)屬於結構型設計模式,其核心思想是動態地將職責附加到物件上。若要擴展功能,裝飾者提供了比繼承更具彈性的替代方案。

關鍵特性

  • 裝飾者與被裝飾物件擁有相同的超型別(介面或抽象類別)
  • 可以用一個或多個裝飾者包裝一個物件
  • 因為型別相同,裝飾後的物件可在任何需要原始物件的場合替代它
  • 裝飾者可在委託被裝飾者行為前後,加入自身邏輯以達成特定目的
  • 物件可在執行時期動態、無限次地被裝飾

Java IO 套件中的經典應用

Java java.io 套件大量採用裝飾者模式,常見範例:

  • new BufferedOutputStream(OutputStream out)
  • new BufferedInputStream(InputStream in)
  • new PrintWriter(OutputStream out)
  • new FilterReader(Reader in)

這些類別皆實作相同介面,被裝飾類別不需知道具體是哪個實作類別裝飾它,透過呼叫裝飾類別方法強化功能。

程式碼實作範例

public interface IReader {
    void read();
}

public class Reader implements IReader {
    @Override
    public void read() {
        System.out.println("read of Reader");
    }
}

public class BufferedReader implements IReader {
    private IReader reader;

    public BufferedReader(IReader reader) {
        this.reader = reader;
    }

    @Override
    public void read() {
        System.out.println("read of BufferedReader");
        reader.read(); // 委託給被裝飾物件
    }
}

public class Test {
    public static void main(String[] args) {
        Reader reader = new Reader();
        reader.read();
        System.out.println("----------");
        BufferedReader bufferedReader = new BufferedReader(reader);
        bufferedReader.read();
    }
}

裝飾者模式四大特徵

  1. 介面一致性:裝飾物件與真實物件擁有相同介面,客戶端可同樣方式互動
  2. 持有引用:裝飾物件內含真實物件的參考
  3. 請求轉發:接收客戶請求並轉發給真實物件
  4. 功能增強:轉發前後可增加額外功能,無需修改原物件結構即可在運行期擴展行為

裝飾者 vs 適配器模式差異

比較維度裝飾者模式適配器模式
核心目的為被裝飾者動態增加新職責轉換介面使不相容類別能協同工作
對包裹物件的認知僅知道其介面,具體型別在運行期才確定知道被適配者的具體實作細節

總結

裝飾者模式以組合取代繼承,提供比靜態繼承更靈活的功能擴展機制,是 Java IO 體系設計的基石,亦廣泛應用於 Spring 等框架的 AOP 實作中。

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