ES8(2017)新特性:async/await、Object.values、Object.entries、String padding等
阿新 • • 發佈:2021-07-07
-
簡單例子說明裝飾者模式
-
星巴克咖啡訂單專案(咖啡管)
-
咖啡種類:Espresso(義大利濃咖啡)、shortBlack、LongBlack、Decaf
-
調料:Milk、Chicilate、Soy(豆漿)
-
要求在擴充套件新的咖啡時,具有良好的延展性、改動方便、維護方便
-
使用OO來計算不同種類咖啡的費用:使用者可以點單品咖啡,也可以單品+調料組合
-
-
實施方案
-
方案一(不推薦)
-
類圖
-
分析
-
Drink是一個抽象類,表示飲料
-
des就是對咖啡的描述,比如咖啡封頂名字,價格等等
-
cost()就是計算費用,在Drink是一個抽象方法
-
單品咖啡繼承了Drink
-
Espress && Milk就是單品咖啡+調料。這種組合很多
-
-
缺點:
-
這樣設計時,當我們增加一個新非咖啡種類或者調料時,類的數量機會倍增,就會出現類爆炸
-
-
-
方案二(比方案一好一些)
-
上面在方案一分析出,如果使用方案一會發生類爆炸,因此方案二進行了改進,將調料內建到Drink,這樣就不會造成類的數量過多,從而提高專案的維護性
-
類圖
-
分析
-
方案二可以控制類的數量,不至於造成很多的類
-
在增加或者刪除調料種類時,程式碼的維護量還是很大
-
考慮到使用者可以新增多份調料時,可以將hasXXX()返回一個int
-
考慮使用裝飾者模模式
-
-
-
-
-
通過裝飾者模式解決上面兩種解決方案的不足、
-
裝飾者模式定義
-
裝飾者模式:動態的將新功能附加到物件上,在物件功能擴充套件方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則
-
這裡提到的動態的將新功能附加到物件和ocp原則,在程式碼會會得以體現
-
-
裝飾者模式原理
-
說明
-
實現圖
-
程式碼實現
//注意分包
//編寫Drink,這是一個比較重要的類
public abstract class Drink{
public String des;//對Drink的描述
private float price = 0.0f;
//增加get和set方法
//計算 費用的抽象方法
public abstract float cost();
}
//編寫coffee類
public class Coffee extends Drink{
-
-