Java IO 體系大量採用裝飾器模式,以靈活組合方式擴展流功能,避免繼承導致的類別爆炸。本文解析裝飾器模式在 IO 流中的應用精髓。
當需要對既有物件動態增強功能時,定義裝飾類別包裝原物件,並實作相同介面。裝飾類別持有被裝飾物件參考,轉發核心邏輯並添加額外行為。
Reader(基礎介面)
├── FileReader(具體元件:讀取檔案)
└── BufferedReader(裝飾器:新增緩衝功能)
BufferedReader 包裝 Reader 子類別,提供 readLine() 等增強方法,且可疊加多層裝飾。
// 繼承方式:類別膨脹、靜態綁定
class Decorator { void eat() { System.out.println("吃飯"); } }
class DecoratorDemo extends Decorator { void eat() { System.out.println("孩子吃飯"); } }
// 裝飾器方式:動態組合、靈活擴展
class DecoratorDemo {
private Decorator decorator;
public DecoratorDemo(Decorator d) { this.decorator = d; }
public void eatFoods() { decorator.eat(); System.out.println("加菜"); }
}
裝飾器模式符合開放封閉原則:對擴展開放,對修改封閉。
掌握裝飾器模式,不僅能深度理解 Java IO 設計哲學,更能在自訂框架中實現優雅的功能擴展機制。