方 案1- 解決星巴克咖啡訂單問題分析
1) drink 是乙個抽象類,表示飲料
2) des就是對咖啡的描述, 比如咖啡的名字
3) cost() 方法就是計算費用,drink 類中做成乙個抽象方法.
4) decaf 就是單品咖啡, 繼承drink, 並實現cost
5) espress && milk 就是單品咖啡+調料, 這個組合很多
6) 問題:這樣設計,會有很多類,當我們增加乙個單品咖啡,或者乙個新的調料,類的數量就會倍增,就會出現類**。
方案2- 解決星巴克咖啡訂 單( 好點)
前面分析到方案1因為 咖啡單品+ 調料組合會造成類的倍增,因此可以做改進,將調料內建到drink類,這樣就不會造成類數量過多。從而提高專案
的維護性
說明 : milk,soy,chocolate 可以設計為boolean,表示是否要新增相應的調料。
方案2- 的問題分析
1) 方案2可以控制類的數量,不至於造成很多的類
2) 在 增加或者刪除調料種類時,**的維護量很大
3) 考慮到使用者可以新增多份 調料時,可以將hasmilk 返回乙個對應int
4) 考慮使用 裝飾者 模式
裝飾者模式原理
1) 裝飾者模式就像 打包乙個快遞
主體:比如:陶瓷、衣服 (component) // 被裝飾者
包裝:比如:報紙填充、塑料泡沫、紙板、木板(decorator)
2) component
主體:比如類似前面的drink
3) concretecomponent和decorator concretecomponent:具體的主體,比如前面的各個單品咖啡decorator: 裝飾者,比如各調料.
4) 在如圖的component 與concretecomponent 之間,如果concretecomponent類很多,還可以設計乙個緩衝層,將共有的部分提取出來,抽象層乙個類。
說明1) milk包含了longblack
2) 乙份chocolate包含了(milk+longblack)
3) 乙份chocolate包含了(chocolate+milk+longblack)
4) 這樣不管是什麼形式的單品咖啡+調料組合,通過遞迴方式可以方便的組合和維護。
//具體的decorator, 這裡就是調味品
public class chocolate extends decorator
}public class coffee extends drink
}public class soy extends decorator
}public class shortblack extends coffee
}public class milk extends decorator
}public class longblack extends coffee
}public class espresso extends coffee
}public abstract class drink
public void setdes(string des)
public float getprice()
public void setprice(float price)
//計算費用的抽象方法
//子類來實現
public abstract float cost();
}public class decorator extends drink
@override
public float cost()
@override
public string getdes()
}public class decaf extends coffee
}public class coffeebar
}
結構型模式 裝飾者設計模式
裝飾模式指的是在不必改變原類檔案和繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件,比如處理流。應用場景 需要擴充套件乙個類的功能,或給乙個類新增附加職責。優點就是耦合性低,重用性高 高內聚,低耦合 按照一般的方法,要麼就是分別修改各自的read方法,...
結構型模式 裝飾者模式
動態地給乙個物件新增一些額外的職責。就增加功能來說,decorator模式相比生成子類更為靈活。1.在不影響其他物件的情況下,以動態 透明的方式給單個物件新增職責。2.處理那些可以撤消的職責。3.當不能採用生成子類的方法進行擴充時。1.component 定義乙個物件介面,可以給這些物件動態地新增職...
結構型模式 裝飾者模式
總結解決乙個問題 裝飾者模式 program ade someproblem author cade franklin create 2019 12 28 28 19 public abstract class drink string getdesc abstract float cost 接下來...