需求:顾客能在购买咖啡(咖啡种类有多种)的同时购买任意种类和数量的调料。
例如顾客想要购买摩卡和奶泡深焙咖啡。分解为:
1.深焙咖啡
2.用调料摩卡装饰深焙咖啡
3.用调料奶泡装饰摩卡深焙咖啡
规定店中所有提供的饮料均继承基类Beverage。
实现图如下:
实现代码如下:
Beverage基类:
public abstract class Beverage { String description="null description"; double cost; public String getDescription() { return description; } public abstract double cost(); public void setCost(double cost) { this.cost = cost; } }
咖啡DarkRoast类:
public class DarkRoast extends Beverage{ //private double cost; public DarkRoast() { description="DarkRoast"; cost=0.99; } public DarkRoast(double cost) { this.cost=cost; } @Override public double cost() { // TODO Auto-generated method stub return cost; } public void setCost(double cost) { this.cost = cost; } }
咖啡Decaf类:
public class Decaf extends Beverage{ //private double cost; public Decaf(){ description="Decaf"; cost=0.9; } public Decaf(double cost) { this.cost=cost; } @Override public double cost() { // TODO Auto-generated method stub return cost; } public void setCost(double cost) { this.cost = cost; } }
咖啡Espresso类:
public class Espresso extends Beverage{ //private double cost; public Espresso(){ description="Espresso"; cost=1.99; } public Espresso(double cost) { this.cost=cost; } @Override public double cost() { // TODO Auto-generated method stub return cost; } public void setCost(double cost) { this.cost = cost; } }
咖啡HouseBlend类:
public class HouseBlend extends Beverage{ //private double cost; public HouseBlend(){ description="HouseBlend"; cost=1.2; } public HouseBlend(double cost) { this.cost=cost; } @Override public double cost() { // TODO Auto-generated method stub return cost; } public void setCost(double cost) { this.cost = cost; } }
装饰者CondimentDecorator基类:
public abstract class CondimentDecorator extends Beverage{ public abstract String getDescription(); }
调料Milk类:
public class Milk extends CondimentDecorator{ Beverage beverage; public Milk(Beverage beverage) { this.beverage=beverage; cost=0.3; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription()+", Milk"; } @Override public double cost() { // TODO Auto-generated method stub return cost+beverage.cost(); } public Beverage getBeverage() { return beverage; } public void setBeverage(Beverage beverage) { this.beverage = beverage; } }
调料Mocha类:
public class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage) { this.beverage=beverage; cost=0.2; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription()+", Mocha"; } @Override public double cost() { // TODO Auto-generated method stub return cost+beverage.cost(); } public Beverage getBeverage() { return beverage; } public void setBeverage(Beverage beverage) { this.beverage = beverage; } }
星兹巴咖啡店模拟:
public class StarbuzzCoffee { public static void main(String [] args) { Beverage beverage=new Espresso(); beverage.setCost(1.999); System.out.println(beverage.getDescription()+" $"+beverage.cost()); Beverage beverage2=new DarkRoast(); beverage2=new Mocha(beverage2); beverage2=new Mocha(beverage2); beverage2=new Milk(beverage2); System.out.println(beverage2.getDescription()+" $"+beverage2.cost()); } }