?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。
🍎個人主頁:Meteors.的博客
💞當前專欄:設計模式
?特色專欄:知識分享
🥭本文內容:23種設計模式——裝飾器模式(Decorator Pattern)
📚 ** ps **? :閱讀文章如果有問題或者疑惑,歡迎在評論區提問或指出。
目錄
一. 背景
二. 簡介
三. 特點
四. 適用場景
五. 代碼示例
六.?總結
一. 背景
剛學習這個設計模式感覺它和工廠模式長的很像(都有一個抽象類)。但具體觀察,發現它最大的不同——套娃(一個抽象裝飾器類,里面有基類變量和參數為基類變量的構造方法,之后每次繼承裝飾器,并傳入這個變量,就能得到一個新的裝飾器.......你可能會問這樣“套娃”的新類有什么不同?其實每次繼承的時候,它還會重寫其它方法,對方法進行設定)
二. 簡介
裝飾器模式是一種結構型設計模式,它允許向一個現有的對象添加新的功能,同時又不改變其結構。這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
三. 特點
- 動態地為對象添加功能
- 比繼承更靈活(避免繼承導致的子類膨脹問題)
- 裝飾類和被裝飾類可以獨立發展,不會相互耦合
- 符合"開閉原則"(對擴展開放,對修改關閉)
四. 適用場景
- 需要在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責
- 需要動態添加功能,也能動態撤銷功能
- 當不能采用繼承的方式對系統進行擴充時
五. 代碼示例
// 抽象組件
interface Coffee {double getCost();String getDescription();
}// 具體組件
class SimpleCoffee implements Coffee {@Overridepublic double getCost() {return 1.0;}@Overridepublic String getDescription() {return "Simple coffee";}
}// 抽象裝飾器
abstract class CoffeeDecorator implements Coffee {protected final Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}@Overridepublic double getCost() {return decoratedCoffee.getCost();}@Overridepublic String getDescription() {return decoratedCoffee.getDescription();}
}// 具體裝飾器 - 加牛奶
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.5;}@Overridepublic String getDescription() {return super.getDescription() + ", with milk";}
}// 具體裝飾器 - 加糖
class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.2;}@Overridepublic String getDescription() {return super.getDescription() + ", with sugar";}
}// 使用示例
public class DecoratorPatternDemo {public static void main(String[] args) {Coffee simpleCoffee = new SimpleCoffee();System.out.println("Cost: " + simpleCoffee.getCost() + "; Description: " + simpleCoffee.getDescription());Coffee milkCoffee = new MilkDecorator(simpleCoffee);System.out.println("Cost: " + milkCoffee.getCost() + "; Description: " + milkCoffee.getDescription());Coffee sugarMilkCoffee = new SugarDecorator(milkCoffee);System.out.println("Cost: " + sugarMilkCoffee.getCost() + "; Description: " + sugarMilkCoffee.getDescription());}
}
六.?總結
裝飾器模式通過組合而非繼承的方式擴展對象的功能,提供了比繼承更有彈性的替代方案。在Java中,IO流的設計就是裝飾器模式的經典應用(如BufferedReader裝飾FileReader)。當需要為對象動態添加功能時,裝飾器模式是一個很好的選擇。
最后,
? ? ? ? 其它設計模式會陸續更新,希望文章對你有所幫助!