1. 頂咖啡問題
咖啡種類:Espresso,LongBlack
調料:Milk,Soy
當需要計算不同種類咖啡和調料組合的價格時
(1)使用傳統方式

這樣設計,會有很多類,當需要增加一個單品咖啡或調料時,類的數量就會倍增
(2)優化方式1

優點:可以把調料放入Drink類中,通過設計調料的boolean類型,表示添加相應的調料,減少類的數量
缺點:增加或刪除調料種類時,代碼的維護量同樣比較大
(3)裝飾者模式
動態的將新功能附加到對象上

public abstract class Drink { public String desc; private float price; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public abstract float cost(); }
public class Coffee extends Drink { @Override public float cost() { return super.getPrice(); } }
public class LongBlack extends Coffee{ public LongBlack(){ setDesc(" longblack "); setPrice(5.0f); } }
public class Espresso extends Coffee { public Espresso(){ setDesc(" 意大利咖啡 "); setPrice(1.0f); } }
public class Decorator extends Drink { private Drink drink; public Decorator(Drink drink){ this.drink = drink; } @Override public float cost() { return drink.cost() + super.getPrice(); } @Override public String getDesc() { return desc + " " + getPrice()+ "&&" + super.getDesc(); } }
public class Milk extends Decorator { public Milk(Drink drink){ super(drink); setDesc( " 牛奶 "); setPrice(2.0f); } }
public class Soy extends Decorator { public Soy(Drink drink) { super(drink); setDesc(" 豆漿 "); setPrice(3.0f); } }
public class Client { public static void main(String[] args) { //裝飾者模式下 : //1. 點一份 longblack Drink order = new LongBlack(); System.out.println("費用1=" + order.cost()); System.out.println("描述=" + order.getDesc()); //2. order 加入牛奶 order = new Milk(order); System.out.println(" order 加入牛奶 費用2= " + order.cost()); System.out.println(" order 加入牛奶 描述=" + order.getDesc()); //3. order 加入豆漿 order = new Soy(order); System.out.println(" order 加入豆漿,加入牛奶 費用3= " + order.cost()); System.out.println(" order 加入豆漿,加入牛奶 描述=" + order.getDesc()); } }
浙公網安備 33010602011771號