天天看点

某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用

某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用,咖啡店所供应的咖啡机配料的种类和价格如下表所示:

咖啡 价格/杯(元) 配料 价格/份(元)

蓝山咖啡(BlueCoffee) 8 牛奶(Milk) 2

拿铁咖啡(NatieCoffee) 10 橙汁(Orange) 3

试用装饰者模式为该咖啡店设计一个程序以实现计算费用的功能,输出每种饮料的详细信息描述及花费。要求绘制类图并使用Java语言模拟实现。

uml类图:

某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用

抽象类

package com.packag.zheng;

public abstract class Component {   //定义抽象类
  
  public abstract String getDescription();      //实现不同咖啡和装饰者
  public abstract double cost();  //实现价格计算的业务

}      

需要装饰的具体类

package com.packag.zheng;

public class BlueCoffee extends Component {

  @Override
  public String getDescription() {
    return "蓝山咖啡"; // 描述咖啡类型

  }

  @Override
  public double cost() {
    return 8; // 描述价格

  }

}      
package com.packag.zheng;

public class NatieCoffee extends Component {

  @Override
  public String getDescription() { // 名称

    return "拿铁咖啡";
  }

  @Override
  public double cost() { // 价格

    return 10;
  }

}
      

抽象装饰组件

package com.packag.zheng;

public abstract class ComponentDecrator extends Component{
  public abstract String getDescription();  //抽象装饰的内容
  
}      

装饰构件

package com.packag.zheng;

public class Milk extends ComponentDecrator {
  Component type; // 抽象构件对象

  // 构造方法
  public Milk(Component type) {
    this.type = type;
  }

  @Override
  public double cost() {

    return 2 + type.cost(); // 牛奶价格加上具体构件的价格
  }

  @Override
  public String getDescription() {
    return "牛奶" + type.getDescription(); // 加上配料牛奶后的描述
  }

}      
package com.packag.zheng;

//橘子汁充当具体装饰类
public class Orange extends ComponentDecrator {
  Component type; // 抽象构件对象
  // 构造方法

  public Orange(Component type) {
    this.type = type;
  }

  @Override
  public String getDescription() {
    // TODO 自动生成的方法存根
    return "橘子汁" + type.getDescription();
  }

  @Override
  public double cost() {
    // TODO 自动生成的方法存根
    return type.cost() + 3;
  }

}      

测试端

package com.packag.zheng;

public class Client {

  public static void main(String[] args) {
    // TODO 自动生成的方法存根
    Component com1,com2,com3;//抽象构件独
    com1=new BlueCoffee();//子类实例化对象,具体构件蓝山咖啡
    com1=new Milk(com1);  //添加装饰类购件
    System.out.println("加了"+com1.getDescription()+"的价格:"+com1.cost()+"元");
    
    com2=new NatieCoffee();
    com2=new Orange(com2);
    System.out.println("加了"+com2.getDescription()+"的价格:"+com2.cost()+"元");
    
    
    com3=new BlueCoffee();//实例化拿铁咖啡的对象
    com3=new Orange(com3);//添加构件橘子汁
    com3=new Milk(com3);
    System.out.println("加了"+com3.getDescription()+"的价格:"+com3.cost()+"元");


  }

}      

运行截图

某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用