星巴克的饮料计价系统—装饰者模式

2023-11-03 12:10

本文主要是介绍星巴克的饮料计价系统—装饰者模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

案例:

星巴克是很出名的高级饮料店,她有一个非常酷的饮料价格计算系统,这个系统的设计是这样的:

这个设计可谓相当地酷!Coffee(咖啡)、Mocha(摩卡)、Latte(拿铁)这三种饮品都实现了IDrink接口,要计算它们的价钱真是相当的容易,而且不管以后增加怎样的饮品,只要实现了IDrink接口,很容易计算价钱,PriceCalculator不用作任何修改。

不过星巴克的饮料出名,有一个很重要的做法就是每种饮料都可以加配料,如:牛奶、豆浆、雪糕等,而且配料可以加多种和多份,加了配料的饮料价格是:饮料+所有配料的价钱。

Well,怎样修改这个设计?配料要怎样考虑进去呢?

分析:

我们看看应用了装饰者模式的设计:

说明:

1.饮料的设计没有变化,但增加了一个DrinkDecorator(饮料装饰者),它和饮料一样,实现了IDrink接口。

2.DrinkDecorator是用来装饰某种饮料的,它装饰的饮料通过构造函数传入。

3.DrinkDecorator是抽象类,具体的配料Milk(牛奶)、Ice-cream(冰淇淋)类需要继承它。

如果我们想得到Coffee+Milk的价钱,代码如下:

Milk milk = newMilk(new Coffee);

Money money =milk.GetPrice();

第一句代码的意思是:新建一个装饰者Milk,同时将它要装饰的对象Coffee传入。

第二句代码的意思是:调用装饰者Milk的GetPrice()方法,就可以得到Coffee+Milk的总价钱。

为什么会这样呢?请仔细看看图中Ice-cream类的注释,说明了GetPrice()的实现方法,装饰者返回的 Price 是被装饰者的 Price 加上装饰者自己的价钱。

那怎样计算一杯摩卡(Mocha)加上一份牛奶(Milk)和一份冰淇淋(Ice-cream)的价钱呢?

代码如下:

Ice-creamice-cream = new Ice-cream(new Milk(new Mocha));

Money money =ice-cream.GetPrice();

配料和饮料一样,同样是实现了IDrink接口,我们再仔细看看配料装饰的东西是IDrink类型的,所以配料也能装饰配料。所以无论是加上多少份配料或者多少种配料,都可以通过类似第一句的写法解决。

装饰者模式是多么地神奇啊,我们看看它的类图:

说明:

1.被装饰者和装饰者实现了相同的接口。

2.装饰者含有指向被装饰者的引用。

3.被装饰者可以被多个装饰者装饰。

请问在 CocosCreator 中那里有出现装修者模式呢?欢迎来留言讨论!

本文是不是给你带来了一些收获呢?

快转发一下啦,转发的朋友特别好运噢,谢谢!

这篇关于星巴克的饮料计价系统—装饰者模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338070

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架