• 装饰者模式


    需求:顾客能在购买咖啡(咖啡种类有多种)的同时购买任意种类和数量的调料。

    例如顾客想要购买摩卡和奶泡深焙咖啡。分解为:

    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());
    
    }
    }
    

      

  • 相关阅读:
    十六进制计算器
    USB 3.0规范中译本 第7章 链路层
    from表单POST提交nodejs
    07_通过谷歌封装的api操作数据库delete&insert
    06_直接执行sql操作数据库delete&update
    05_直接执行sql操作数据库
    04_数据库升级onUpgrade&ondowngrade
    03_通过OpenHelper获取SqliteDatabase对象
    02_SQliteOpenHelper介绍&oncreate方法介绍
    00_前情回顾&今日展望
  • 原文地址:https://www.cnblogs.com/yanglf/p/3885863.html
Copyright © 2020-2023  润新知