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

时间:2022-12-24 10:51:20

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

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