一,问题引入
辛巴克咖啡订单项目
1.咖啡种类:Espresso(意大利浓咖啡),ShortBlack,LongBlack(美式咖啡),Decaf(无因咖啡)
2.调料:milk,soy(豆浆),Chocolate
3.要球在扩展新的咖啡种类时,具有良好的扩展性,改动方便,易于维护
4.使用oo的思想来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以点单品咖啡+调料组合
二,解决方案一
三,解决方案二
四,使用装饰模式
1.装饰模式:动态的将新功能附加到对象上,在对功能扩展方面,他比继承更有弹性,装饰模式也体现了开闭原则
2.原理图
3.使用装饰模式设计类关系
4.代码实现
Drink类:
package 设计模式.装饰模式;
public abstract class Drink {
public String des;
private float price =0.0f;
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public abstract float cost();
}
Decorator
package 设计模式.装饰模式;
public class Decorator extends Drink{
private Drink obj;
public Decorator(Drink obj){
this.obj=obj;
}
@Override
public float cost() {
return super.getPrice()+obj.cost();
}
public String getDes(){
return super.des+"&&"+obj.getDes();
}
}
Coffee类:
package 设计模式.装饰模式;
public class Coffee extends Drink{
@Override
public float cost() {
return super.getPrice();
}
}
Espresso:
package 设计模式.装饰模式;
public class Espresso extends Coffee{
public Espresso(){
setDes("Espresso");
setPrice(1.0f);
}
}
LongBlack
package 设计模式.装饰模式;
public class LongBlack extends Coffee{
public LongBlack(){
setDes("Longblack");
setPrice(2.0f);
}
}
ShortBlack
package 设计模式.装饰模式;
import 设计模式.原型模式.improve.Sheep;
public class ShortBlack extends Coffee{
public ShortBlack(){
setDes("ShortBlack");
setPrice(3.0f);
}
}
Milk
package 设计模式.装饰模式;
public class Milk extends Decorator {
public Milk(Drink obj) {
super(obj);
setDes("Milk");
setPrice(1.2f);
}
}
Soy
package 设计模式.装饰模式;
public class Soy extends Decorator {
public Soy(Drink obj) {
super(obj);
setDes("Soy");
setPrice(1.99f);
}
}
Chocolate
package 设计模式.装饰模式;
public class Chocolate extends Decorator {
public Chocolate(Drink obj) {
super(obj);
setDes("Chocolate");
setPrice(3.0f);//调味品价格
}
}
CoffeeStore://试用装饰模式下订单:2分巧克力+一份牛奶+一份LongBlack
package 设计模式.装饰模式;
public class CoffeeStore {
public static void main(String []args){
//试用装饰模式下订单:2分巧克力+一份牛奶+一份LongBlack
Drink drink=new LongBlack();
System.out.println(drink.getDes());
System.out.println(drink.getPrice());
drink=new Milk(drink);
System.out.println(drink.getDes());
System.out.println(drink.cost());
drink=new Chocolate(drink);
drink=new Chocolate(drink);
System.out.println(drink.getDes());
System.out.println(drink.cost());
}
}