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

简介: 该博客文章使用装饰者模式为咖啡店设计了一个程序,通过Java语言实现了根据不同配料计算咖啡总费用的功能,并提供了详细的类图和代码实现,同时讨论了装饰者模式的优缺点。

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

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

咖啡 价格/杯(元) 配料 价格/份(元)
蓝山咖啡(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()+"元");


    }

}

运行截图
在这里插入图片描述
优点:1、对于扩展一个对象的功能,装饰者模式比继承更加灵活。2、可以通过动态的方式来扩展一个对象的功能。3、可以对一个对象进行多次装饰。4、具体构件类与具体装饰类可以独立变化。
缺点:1、会产很很多的小对象,小对象会占用更多的系统资源,在一定程度上影响程序的性能。2、容易出错并且不容易找到出错的地方。

相关文章
|
前端开发 Java 关系型数据库
喝不起奶茶,咱就为奶茶店开发个会员积分收银系统
本系统基于SSM框架开发实现,前端使用easyui开发实现,功能强大,界面美观,数据库使用mysql数据库,开发工具采用idea。 系统部分功能展示如下: 系统管理员登陆: admin /admin
793 0
喝不起奶茶,咱就为奶茶店开发个会员积分收银系统
|
存储 供应链
卖出亿万件商品的亚马逊,在物流这件事情上做对了什么?
  亚马逊近期发表了截至 2021 年 12 月 30 日年度财报。报告显示,亚马逊2021年净销售额为 304 亿美元,净利润为 8.57 亿美元,与2020年同期的净利润 9200 万美元相比大幅增长。这是亚马逊连续第五年盈利。   因业绩好于预期,亚马逊股价上涨 6.2 美元至 758.81 美元,涨幅为 0.82%,亚马逊的市值因此而上升至 3580 亿美元。差不多相当于沃尔玛、联邦快递(FedEx)和波音公司三家公司的价值总和。亚马逊也成为美国市值最高的第五大公司。   从售卖图书开始,亚马逊的电商业务一直带动着货运的发展。彭博商业周刊昨天发表一篇关于亚马逊物流的文章:「亚马逊会
168 0
|
安全 定位技术
“我在青藏高原卖面膜”
“在那东山顶上,升起白白的月亮,年轻姑娘的面容,浮现在我的心上。”
“我在青藏高原卖面膜”
|
iOS开发 智能硬件
春运火车票可花呗分期;果冻有家,关注年轻人租房子的隐藏需求
春运火车票可花呗分期;果冻有家,关注年轻人租房子的隐藏需求
517 0
|
供应链 机器学习/深度学习 vr&ar
果冻有家,“抢房”“抢用户”,不如抢“平衡”;苏宁海尔签下300亿大单。
果冻有家,“抢房”“抢用户”,不如抢“平衡”;苏宁海尔签下300亿大单。
282 0
|
新零售 分布式计算 MaxCompute
【转载】为什么只有好超市,才敢卖熟牛油果?
本文授权转载自“硅谷洞察”(微信公众号ID: Guigudiyixian) 版权归“硅谷洞察”所有,未经许可不得二次转载 在很多人的印象里,去市场或超市买水产海鲜,谈不上是一件多么享受的事情。但这两年突然爆红的盒马鲜生,则颠覆了人们的这种印象。
2006 0
|
黑灰产治理 安全
6秒售空168套房?房产生活号新玩法
生活号服务商“筑家易”,借助生活号平台及支付宝能力,开启“云选房”时代:实现新房小区线上开盘、线上预约、线上交付! 7月28日“北岸江山”开盘 首次采用“生活号+筑家易云选房” 开盘6秒瞬间售房168套! 支付宝缴纳保证金192万元,房产总成交近2亿元! 9月19日晚“北岸江山”二期开盘 23 秒售完 115套房源 平均每秒成交5套,最终成交额破2亿元 这样的案例还有很多…… 01.生活号+支付宝实名认证、蚁盾   在线售房,交易更安全    整个“云选房”系统依托于支付宝系统:每个参与开盘用户都经过支付宝实名认证;“蚁盾”风险评分可有效识别存在机器注册、恶意刷单、黄牛抢购等问题的手机号等。
692 0
设计一个卖不同种类车的4s店
# 定义奔驰车类 class BenchiCar(object): # 定义车的方法 def move(self): print('---奔驰车在移动---') def stop(self): print('---奔驰车停车了---') #...
818 0