本文原內容為空,此處提供裝飾器模式核心解析:
裝飾器模式:動態地給對象添加額外職責,靈活替代繼承實現功能擴展。符合開閉原則:對擴展開放,對修改關閉。
// 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="濃縮咖啡, 加奶, 加糖"
| 維度 | 繼承 | 裝飾器 | 代理 |
|---|---|---|---|
| 關係 | is-a (靜態) | has-a (動態組合) | has-a (控制訪問) |
| 擴展方式 | 子類化 | 運行時包裹 | 運行時包裹 |
| 目的 | 復用/特化 | 增強功能 | 控制/代理 |
| 層級 | 單層 | 多層疊加 | 單層 |
final) 需擴展裝飾器模式是組合優於繼承的教科書級應用。Java I/O、Collections.synchronizedList、Spring TransactionInterceptor 皆為經典實踐。**核心思想:薄包裹、厚功能、任意疊加**。