咖啡店的项目引出装饰者模式 | 学习笔记

简介: 快速学习咖啡店的项目引出装饰者模式

开发者学堂课程【Scala 核心编程 - 进阶咖啡店的项目引出装饰者模式学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9138


咖啡店的项目引出装饰者模式


内容介绍:

一、装饰者模式

二、方案1-较差的方案

三、方案1-小结与分析

四、方案2-较好的方案

五、方案2的问题分析

六、体系图

七、装饰者模式原理

讲解的内容,首先是设计模式,还有示范型上下界,视图界定上下文界定还有协变逆变不变。


一、装饰者模式(Decorator)

看一个项目需求

咖啡馆订单系统项目(咖啡馆):

1)咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)

2)调料:Milk、Soy(豆浆)、Chocolate

3)要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便

4)使用OO(面向对象)的来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖啡+调料组合。

比如说要点一份意大利浓咖啡,然后要求加一份牛奶,然后去计算价格,或者是点了一份美式咖啡,还要加两份巧克力,然后去算总的价格。


二、方案1-较差的方案

image.png

先抽象出来一个类叫 drink,不管是什么样单品它都是饮料,有一个描述为description,Cost 是计算费用,较差的方案就是单品单独设计一个类,比如有一个人再点一份意大利咖啡,她说她想加一份牛奶,这就成为了一个新的组合,如果espresso 再加一份牛奶和豆浆,就又成为了一个类,这样会出现类爆炸现象,现在单品咖啡有四个,调料有三种,一个单品就会对应七个类,加上单品本身就有八种,然后再乘以四,就有32种可能,就会出现类爆炸。


三、方案1-小结与分析

1) Drink 是一个抽象类,表示饮料

2) description 就是描述,比如咖啡的名字等3) cost就是计算费用,是一个抽象方法

4) Decaf 等等就是具体的单品咖啡,继承Drink,并实现cost方法

5) Espresso&&Milk 等等就是单品咖啡+各种调料的组合,这个会很多..

6)这种设计方式时,会有很多的类,并且当增加一个新的单品咖啡或者调料时,类的数量就会倍增(爆炸)


四、方案2-较好的方案

前面分析到方案1因为咖啡单品+调料组合会造成类的倍增,因此可以做改进,将调料内置到 Drink 类,这样就不会造成类数量过多。从而提高项目的维护性(如图)

说明:

milk,soy,choclate 可以设计为 Boolean,表示是否要添加相应的调料.

这样设计过后,类只要有四个就可以了,将来在设计的时候,比如说想要一份豆浆,直接在cost里面判断有没有就可以了


五、方案2的问题分析

1)方案2可以控制类的数量,不至于造成过多的类。

2)在增删调料种类时,代码维护量仍然很大。如果将来drink增加了一份调料,比如说是豆腐脑,那么就需要修改drink,就会很麻烦,这就违反了ocp原则,因为再加一个单品的时候,代码的变化是很大的。

3)考虑到添加多份调料时,可以将Boolean改成Int


六、体系图

一个项目的类的体系图,里面有很多的类,包括里面有继承关系。

1.在开发中要求尽量的遵守 ocp

开闭原则

将来如果要增加一个功能,这些代码尽量都不要去进行修改,可以直接加一个类进去,把新类加进去功能就增加了,整个体系是没有发生变化的。

2. ocp (开闭原则):通过增加新的类,来扩展功能.

开闭原则:开:指的是功能扩展开放,闭:不要去修改已有的代码


七、装饰者模式原理

1)装饰者模式就像打包一个快递

主体:比如:陶瓷、衣服

>包装:比如:报纸填充、塑料泡沫、纸板、木板

2) Component

主体:比如类似前面的 Drink

3) ConcreteComponent 和 Decorator

ConcreteComponent:具体的主体,

比如前面的各个单品咖啡

Decorator:装饰者,比如各调料.

4)在如图的 Component 与 ConcreteComponent 之间,如果

ConcreteComponent 类很多,还可以设计一个缓冲层,将共有的部分提取出来,抽象层一个类。

相关文章
|
2月前
|
数据采集 机器学习/深度学习 人工智能
YOLOv11浅浅解析:架构创新
YOLOv11是YOLO系列最新升级版,通过C3k2模块、SPPF优化和解耦检测头等创新,显著提升检测精度与速度,mAP提高2-5%,推理更快,支持多平台部署,适用于工业、安防、自动驾驶等场景。
|
缓存
银河麒麟server-V10配置镜像源
银河麒麟server-V10配置镜像源
16223 1
|
关系型数据库 MySQL 数据库
django4版本提示 django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.26)
在学习Django时,用户遇到`django.db.utils.NotSupportedError`,提示需要MySQL 8.0.25或更高版本,但其系统上是5.7.26。为解决这个问题,用户决定不升级MySQL,而是选择注释掉Django源码中的数据库版本检查。通过Python命令行找到Django安装路径,进入`db/backends/base/base.py`,注释掉`self.check_database_version_supported()`函数
1716 0
|
2月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
676 57
|
3月前
|
安全 Ubuntu Linux
如何安装Linux操作系统?
此时,您可以选择重新启动计算机,然后从硬盘上的Linux系统启动。以上是一个大致的安装过程。请注意,不同的Linux发行版可能会在细节上有所差异,因此在进行安装之前,请确保您阅读并理解了相应发行版的安装指南或文档。
|
7月前
|
人工智能 自然语言处理 运维
让搜索引擎“更懂你”:AI × Elasticsearch MCP Server 开源实战
本文介绍基于Model Context Protocol (MCP)标准的Elasticsearch MCP Server,它为AI助手(如Claude、Cursor等)提供与Elasticsearch数据源交互的能力。文章涵盖MCP概念、Elasticsearch MCP Server的功能特性及实际应用场景,例如数据探索、开发辅助。通过自然语言处理,用户无需掌握复杂查询语法即可操作Elasticsearch,显著降低使用门槛并提升效率。项目开源地址:<https://github.com/awesimon/elasticsearch-mcp>,欢迎体验与反馈。
1977 1
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模板),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、丰富的组件库和灵活的布局设计,适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业快速实现数字化转型。
完全开源!国内首个完全开源JAVA企业级低代码平台
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
Kubernetes Cloud Native Java
探索未来编程新纪元:Quarkus带你秒建高性能Kubernetes原生Java应用,云原生时代的技术狂欢!
Quarkus 是专为 Kubernetes 设计的全栈云原生 Java 框架,凭借其轻量级、快速启动及高效执行特性,在 Java 社区脱颖而出。通过编译时优化与原生镜像支持,Quarkus 提升了应用性能,同时保持了 Java 的熟悉度与灵活性。本文将指导你从创建项目、编写 REST 控制器到构建与部署 Kubernetes 原生镜像的全过程,让你快速上手 Quarkus,体验高效开发与部署的乐趣。
423 1
|
JavaScript 前端开发 UED
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js