裝飾者模式(Decorator Pattern)屬於結構型設計模式,其核心思想是動態地將職責附加到物件上。若要擴展功能,裝飾者提供了比繼承更具彈性的替代方案。
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();
}
}
| 比較維度 | 裝飾者模式 | 適配器模式 |
|---|---|---|
| 核心目的 | 為被裝飾者動態增加新職責 | 轉換介面使不相容類別能協同工作 |
| 對包裹物件的認知 | 僅知道其介面,具體型別在運行期才確定 | 知道被適配者的具體實作細節 |
裝飾者模式以組合取代繼承,提供比靜態繼承更靈活的功能擴展機制,是 Java IO 體系設計的基石,亦廣泛應用於 Spring 等框架的 AOP 實作中。