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

简介: 该博客文章使用装饰者模式为咖啡店设计了一个程序,通过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、容易出错并且不容易找到出错的地方。

相关文章
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
|
10月前
|
存储 人工智能 专有云
云栖政企速递|飞天企业版“双I”战略正式发布,开启专有云智能化与国际化新篇章
2025年9月25日,在杭州云栖大会“专有云智能化与国际化论坛”上,阿里云正式发布面向未来十年的飞天企业版“双I”战略——以AI(智能化)为技术方向,International(国际化)为市场方向,全面推动专有云“智能化升级”与“全球化拓展”的双重跃迁。
1440 0
|
10月前
|
缓存 运维 文字识别
《大模型驱动的智能文档解析系统:从领域适配到落地优化的全链路开发实践》
本文聚焦大模型在高端装备制造企业智能文档解析系统的落地实践,针对领域术语理解断层、长文档上下文限制、知识提取精准度不足、响应缓慢、微调成本高、稳定性差等核心痛点,提出对应解决方案:构建领域术语知识底座适配行业语境,以语义分块+关联图谱突破长文档解析瓶颈,用多轮校验+规则库保障知识可靠性,通过分层部署+多级缓存优化响应速度,采用增量微调+prompt工程降低成本并提升泛化能力,依托全链路监控+自动化运维保障长期稳定。优化后,术语识别准确率、知识逻辑完整性显著提升,单文档初步解析响应缩至3秒内,故障发生率降至1.2%,印证大模型落地需全链路协同且贴合领域需求。
792 15
|
机器学习/深度学习 存储 人工智能
Qlib:华尔街颤抖!微软开源金融AI量化投资神器,助力智能投研
Qlib是微软亚洲研究院推出的开源AI量化投资平台,提供从数据处理、模型训练到组合管理的全流程支持,内置高性能数据基础设施和多种机器学习模型。
5805 87
Qlib:华尔街颤抖!微软开源金融AI量化投资神器,助力智能投研
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
1456 2
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
安全 小程序 Java
weixin027校园二手平台的设计与实现+ssm(文档+源码)_kaic
本项目基于微信小程序开发校园二手交易平台,旨在解决大学生闲置物品交易问题。系统采用Java语言和MySQL数据库设计,支持用户浏览、收藏、评价商品及发布闲置物品。管理员可审核商品和用户信息,确保交易安全。系统具备在线搜索功能,方便用户查找商品,并提供实时沟通渠道,增强平台透明度和用户体验。该平台简化了二手交易流程,满足了大学生对便捷、高效交易的需求,具有重要的实际应用价值。
|
安全 网络协议 网络虚拟化
|
存储 Linux 测试技术
在Linux中,如何实现文件系统的快照和克隆?
在Linux中,如何实现文件系统的快照和克隆?
|
机器学习/深度学习 人工智能 算法
【机器学习】基于YOLOv10实现你的第一个视觉AI大模型
【机器学习】基于YOLOv10实现你的第一个视觉AI大模型
2013 0