【设计模式】我终于读懂了装饰者模式。。。

👑星巴克咖啡订单项目(咖啡馆)

1)咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 2)调料:Milk、Soy(豆浆)、Chocolate 3)要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便 4)使用 OO 的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。

👒装饰者模式定义

1)装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp) 2)这里提到的动态的将新功能附加到对象和 ocp 原则,在后面的应用实例上会以代码的形式体现。

👞 装饰者模式解决星巴克咖啡订单

【设计模式】我终于读懂了装饰者模式。。。

🌂装饰者模式下的订单:2 份巧克力+一份牛奶的 LongBlack

【设计模式】我终于读懂了装饰者模式。。。

我们准备最基础的drink类,不管coffee也好,调味品也好,都继承该抽象类

【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。

准备我们的coffee类

【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。

下面有四个类型的coffee

分别是:

【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。

然后我们还需要一个装饰者(可以理解为调味品的超类)

【设计模式】我终于读懂了装饰者模式。。。

下面有三个调味品继承该类

【设计模式】我终于读懂了装饰者模式。。。

分别是

【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。

有了这些之后就开始写我们的主方法

【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。

💼下面我们跟着代码debug下去看一下

👜这里我们new 了一个澳式黑咖啡

【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。

所以他有了描述和价格

【设计模式】我终于读懂了装饰者模式。。。

👝下面我们把coffee包装到牛奶中去了

【设计模式】我终于读懂了装饰者模式。。。

成为了牛奶的obj

【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。

👛我们进入到cost方法中去

【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。
【设计模式】我终于读懂了装饰者模式。。。

这里的getPrice就是自己的价格,然后加上obj的价格

【设计模式】我终于读懂了装饰者模式。。。

描述也是自己的描述加上obj的描述

【设计模式】我终于读懂了装饰者模式。。。

👓现在我们往下走

【设计模式】我终于读懂了装饰者模式。。。

又把牛奶包装到了巧克力当中去,这个时候就开始套娃了,大家发现没有

【设计模式】我终于读懂了装饰者模式。。。

🎣接着我们又进入到了cost方法中去

【设计模式】我终于读懂了装饰者模式。。。

发现先加自己的价格

【设计模式】我终于读懂了装饰者模式。。。

然后进入obj的计算价格中去

【设计模式】我终于读懂了装饰者模式。。。

☕️这个其实又变成牛奶的价格加上coffee的价格,这样一直递归下去,getDes方法也是如此

【设计模式】我终于读懂了装饰者模式。。。

🍵现在我们如果再加一种coffee(新品种)

【设计模式】我终于读懂了装饰者模式。。。

只需要继承我们的Coffee类,然后又开始无限套娃

【设计模式】我终于读懂了装饰者模式。。。

这,就是装饰者模式

🍶装饰者模式在JDK 应用的源码分析

【设计模式】我终于读懂了装饰者模式。。。

🍼InputStream 是抽象类, 类似我们前面讲的 Drink

【设计模式】我终于读懂了装饰者模式。。。

🍺FileInputStream 是 InputStream 子类,类似我们前面的 DeCaf, LongBlack

【设计模式】我终于读懂了装饰者模式。。。

🍻 FilterInputStream 是 InputStream 子类:类似我们前面 的 Decorator 修饰者

【设计模式】我终于读懂了装饰者模式。。。

🍸DataInputStream 是 FilterInputStream 子类,具体的修饰者,类似前面的 Milk, Soy 等

【设计模式】我终于读懂了装饰者模式。。。

🍹FilterInputStream 类 有 protected volatile InputStream in; 即含被装饰者,类似前面的obj

【设计模式】我终于读懂了装饰者模式。。。

🍷 分析得出在 jdk 的 io 体系中,就是使用装饰者模式

【设计模式】我终于读懂了装饰者模式。。。

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design

【设计模式】我终于读懂了装饰者模式。。。

另外如果对Elastic Search感兴趣的话,推荐一下我的专栏,这篇专栏介绍了Elasticsearch的Restful API的入门指南。学习如何使用API进行索引、搜索和分析,包括创建索引、定义映射、添加文档、执行查询等。通过实例和代码片段,快速上手Elasticsearch的Restful API,构建强大的搜索功能。感谢大家支持:

Elastic Search的RestFul API入门

【设计模式】我终于读懂了装饰者模式。。。


原文始发于微信公众号(掉头发的王富贵):【设计模式】我终于读懂了装饰者模式。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/297105.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!