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

咖啡 价格/杯(元) 配料 价格/份(元)
蓝山咖啡(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 {@Overridepublic String getDescription() {return "蓝山咖啡"; // 描述咖啡类型}@Overridepublic double cost() {return 8; // 描述价格}}
package com.packag.zheng;public class NatieCoffee extends Component {@Overridepublic String getDescription() { // 名称return "拿铁咖啡";}@Overridepublic 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;}@Overridepublic double cost() {return 2 + type.cost(); // 牛奶价格加上具体构件的价格}@Overridepublic String getDescription() {return "牛奶" + type.getDescription(); // 加上配料牛奶后的描述}}
package com.packag.zheng;//橘子汁充当具体装饰类
public class Orange extends ComponentDecrator {Component type; // 抽象构件对象// 构造方法public Orange(Component type) {this.type = type;}@Overridepublic String getDescription() {// TODO 自动生成的方法存根return "橘子汁" + type.getDescription();}@Overridepublic 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、容易出错并且不容易找到出错的地方。

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

  1. C#装饰模式——某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用。

    咖        啡                价格/杯(¥)                                配        料                        价 ...

  2. 当元气森林卖咖啡,能否再造一个爆款?

    如果元气森林卖咖啡,你会买吗? 近日,瑞幸咖啡的前人事高管冉浩加入元气森林,引起外界众多猜疑,作为罐装饮料中的一匹黑马,元气森林凭借着"0糖0脂0卡"气泡饮料,硬生生的挤进瓶装饮品 ...

  3. 中石化卖咖啡报:产品体验报告 | 网易云音乐,体验一个“社交+音乐+直播”的动听世界

    本文来自CCTV5直播[www.cctv5zb.net]:原文地址 www.cctv5zb.net/Article/137532.html 转载注明来源 中石化卖咖啡 编辑导语:作为一名音乐爱好者,体 ...

  4. 李宁卖咖啡,意欲何为?

    作者 | 李北辰 来源 | 鲸落商业评论 如果说互联网公司的尽头是搞金融,那么实业公司的尽头就是卖咖啡. 今年年初,中国邮政的"邮局咖啡"猛赚了一波热度:去年,同仁堂咖啡馆成为网红 ...

  5. 谁在「元宇宙」里卖咖啡?

    作者 | 曾响铃 文 | 响铃说 全球首个全场景数实融合的「世界杯元宇宙」音乐盛典,已经落下了帷幕. 在14日与16日举办的两场动感地带世界杯音乐盛典中,既能看到周杰伦.李宇春.G.E.M.邓紫棋.周 ...

  6. 从卖咖啡到做教育,十岁的知乎“折腾”在赚钱路上

    最近的知乎可谓是"热度"空前,先是用"泻药月饼"将一众知乎大V们"邀进"了厕所,然后又在近期成功加入了"月活过亿俱乐部" ...

  7. 瓜子二手车首家严选直卖店开业,发展线下是机遇更是挑战

    近日,瓜子二手车第一家严选直卖店在沈阳开业,全店面积超过23000平方米,能够容纳约560个车位,被拆分为车辆复检区.展示区.洽谈区.过户接待区.金融服务区等服务区域.据悉,瓜子二手车还将以沈阳直卖店 ...

  8. 杰伦亲友团组团卖咖啡?哎哟,不错哦~

    图片来源 新浪微博 作者:李斌 编辑:薄冬梅 来源:<一点财经>公众号 周杰伦的IP价值就能撑起一家上市公司? 9月30日,一家叫巨星传奇的公司向港交所递交了上市申请,恰如其名,这位巨星就 ...

  9. 中关村四通大厦一层手机卖场严重欺骗顾客,黑店!!

     中关村四通大厦一层手机卖场严重欺骗顾客 中关村四通大厦一层(面向海龙大厦,在矮着E中关村世界)品牌手机卖场严重欺骗顾客,在顾客知道被欺骗后,在刚刚付完款,要求退款时,手机卖场拒绝退款. 2014 ...

最新文章

  1. php 缓存模块,PHP缓存之模块缓存(APC)_PHP教程
  2. 西湖大学特聘研究员张岳:自然语言处理的一些瓶颈思考与探索
  3. 翻译:MariaDB RENAME TABLE语句
  4. Cracking the coding interview--Q1.7
  5. CV:翻译并解读2019《A Survey of the Recent Architectures of Deep Convolutional Neural Networks》第一章~第三章
  6. 包邮送书 50 本,你还有什么理由不上进?
  7. js操作table中tr的顺序,实现上移下移一行的效果
  8. [vue] 如何解决vue打包vendor过大的问题?
  9. python10的因数_十五道Python小案例,学会这些,Python基础已过关!
  10. 一年3000家企业涌入,站上风口的男色经济难逃烧钱亏损
  11. 【论文笔记】Neural Graph Collaborative Filtering
  12. 仿uc设置默认浏览器
  13. 弘辽科技:淘宝店铺信用等级怎么看?信用等级怎么提升?
  14. Runtime Error! R6025-pure virtual function call 问题怎么解决
  15. 备胎的自我修养 | (1)备胎的境界--七友
  16. RAKsmart高防服务器怎么样
  17. android开发方法数,Android方法数methods超过65536详解
  18. 基于java斗地主_码云推荐开源项目丨 用 Java 写了一个控制台玩的斗地主
  19. zt:寻找Nina Reiser的悬赏已增至2万5千美元
  20. 数据分析入门,深入浅出的数据分析

热门文章

  1. 哈弗结构和冯诺依曼结构的简介和区别
  2. String类型长度限制问题
  3. QIIME 2用户文档. 4人体微生物组分析Moving Pictures(2019.7)
  4. SpringBoot的Cacheable缓存问题一则
  5. Creator3D:太厉害了!3D模型原来可以这样显示在2DUI上
  6. Sql server 2008镜像配置步骤
  7. 【class】类的访问权限
  8. 给大家推荐一款小巧简单功能齐全的截屏录屏软件--FSCapture
  9. 微信小程序自定义弹出模态框禁止底部滚动
  10. Android 便捷的方式实现Activity变暗的效果