iPhone 13 系列釋出會期間蘋果被 EFF 拉橫幅抗議:“不要掃描我們的手機”
阿新 • • 發佈:2021-09-27
裝飾者模式的定義
裝飾著模式:動態的將新功能附加到物件上,在物件功能擴充套件方面,他比繼承更有彈性,裝飾著模式也體現出了OCP原則
裝飾者模式原理
星巴克訂單專案:
1.咖啡種類/單品咖啡:Espresso、ShortBlack、LongBlack、Decaf
2.調料:Milk、Soy、Chocolate
3.要求在擴充套件新的咖啡種類時,具有良好的擴充套件性、改動方便、維護方便
4.使用OO的來方法計算不同種類咖啡的費用:客戶可以點單品咖啡 ,也可以單品咖啡+調料組合
package com.cedric.decorator; public class Coffee extends Drink{ @Override public float cost() { return super.getPrice(); } } package com.cedric.decorator; public class LongBlack extends Coffee{ public LongBlack(){ setDes("LongBlack"); setPrice(5.0f); } } package com.cedric.decorator; public class ShortBlack extends Coffee{ public ShortBlack(){ setDes("ShortBlack"); setPrice(7.0f); } } package com.cedric.decorator; public class DeCaf extends Coffee{ public DeCaf(){ setDes("無因咖啡"); setPrice(9.0f); } }
package com.cedric.decorator; public abstract class Drink { public String des;//描述 private float price = 0.0f; public String getDes() { return des; } public void setDes(String des) { this.des = des; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } // 計算費用的抽象方法 // 子類來實現 public abstract float cost(); }
package com.cedric.decorator; // 具體的Decorator,這裡就是調味品 public class Chocolate extends Decorator{ public Chocolate(Drink obj) { super(obj); setDes("巧克力"); setPrice(3.0f);// 調味品的價格 } } package com.cedric.decorator; public class Milk extends Decorator{ public Milk(Drink obj) { super(obj); setDes("牛奶"); setPrice(2.0f); } } package com.cedric.decorator; public class Soy extends Decorator{ public Soy(Drink obj) { super(obj); setDes("豆漿"); setPrice(1.5f); } }
package com.cedric.decorator;
public class CofferBar {
public static void main(String[] args) {
// 裝飾者模式下的訂單:2份巧克力 + 一份牛奶的LongBlack
// 1.點一份LongBlack
Drink order = new LongBlack();
System.out.println(order.getDes() + ":"+ order.cost());
// 2.加入一份牛奶
order = new Milk(order);
System.out.println("加入一份牛奶 :" + order.getDes() + ":"+ order.cost());
// 3.order加入一份巧克力
order = new Chocolate(order);
System.out.println("加入一份牛奶 和 巧克力 :" + order.getDes() + ":"+ order.cost());
// 4.order又加入一份巧克力
order = new Chocolate(order);
System.out.println("加入一份牛奶 和 兩份巧克力 :" + order.getDes() + ":"+ order.cost());
// 點一份DeCaf
Drink drink = new DeCaf();
System.out.println(drink.getDes() + drink.getPrice());
}
}
package com.cedric.decorator;
public class Decorator extends Drink{
private Drink obj;
public Decorator(Drink obj){ //組合
this.obj = obj;
}
@Override
public float cost() {
//getPrice自己的價格
return super.getPrice() + obj.cost();
}
@Override
public String getDes() {
// obj.getDes()輸出被裝飾者資訊
return super.des + " " + super.getDes() + "&&" + obj.getDes();
}
}