Java 裝飾器模式(Decorator Pattern)詳解
🎁 什么是裝飾器模式?
裝飾器模式是一種結構型設計模式,允許向一個對象動態添加新的功能,而不改變其結構。
🧱 你可以想象成在原有功能上“包裹”一層新功能,就像“套娃”或者“包禮物”。
🧠 使用場景
- 需要在不修改類的情況下,擴展其功能
- 需要動態地為對象添加功能
- 多個類只有少量差異時,使用繼承會導致類爆炸
🏗? 模式結構
- Component(抽象構件):定義對象接口
- ConcreteComponent(具體構件):被裝飾的原始對象
- Decorator(裝飾器抽象類):持有組件對象的引用,擴展功能
- ConcreteDecorator(具體裝飾器):實現具體增強功能
? 示例:咖啡加配料
抽象組件
public interface Coffee {String getDescription();double cost();
}
具體組件
public class SimpleCoffee implements Coffee {@Overridepublic String getDescription() {return "普通咖啡";}@Overridepublic double cost() {return 5.0;}
}
抽象裝飾器
public abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}@Overridepublic String getDescription() {return decoratedCoffee.getDescription();}@Overridepublic double cost() {return decoratedCoffee.cost();}
}
具體裝飾器:加牛奶
public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return super.getDescription() + " + 牛奶";}@Overridepublic double cost() {return super.cost() + 2.0;}
}
具體裝飾器:加糖
public class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return super.getDescription() + " + 糖";}@Overridepublic double cost() {return super.cost() + 1.0;}
}
客戶端使用
public class Main {public static void main(String[] args) {Coffee coffee = new SimpleCoffee();coffee = new MilkDecorator(coffee);coffee = new SugarDecorator(coffee);System.out.println(coffee.getDescription() + ",價格:" + coffee.cost());}
}
🧩 優點
- 靈活、可擴展性強,支持動態組合
- 避免類繼承造成的類爆炸
- 滿足開閉原則
?? 缺點
- 多層裝飾器會增加系統復雜度,調試不易
- 對象結構可能過于復雜,難以理解
? 使用建議
- 當你希望在運行時增加對象行為,而不是通過繼承
- 多個類之間功能相似,可通過組合代替繼承