文章目录
-
- 星巴克咖啡订单项目(咖啡馆)
- 装饰者模式定义
- 装饰者模式解决星巴克咖啡订单
-
- 装饰者模式下的订单:2 份巧克力+一份牛奶的 LongBlack
- 下面我们跟着代码debug下去看一下
-
- 这里我们new 了一个`澳式黑咖啡`
- 下面我们把coffee包装到牛奶中去了
- 我们进入到cost方法中去
- 现在我们往下走
- 接着我们又进入到了cost方法中去
- ☕️这个其实又变成牛奶的价格加上coffee的价格,这样一直递归下去,getDes方法也是如此
- 现在我们如果再加一种coffee(新品种)
- 装饰者模式在JDK 应用的源码分析
-
- InputStream 是抽象类, 类似我们前面讲的 Drink
- FileInputStream 是 InputStream 子类,类似我们前面的 DeCaf, LongBlack
- FilterInputStream 是 InputStream 子类:类似我们前面 的 Decorator 修饰者
- DataInputStream 是 FilterInputStream 子类,具体的修饰者,类似前面的 Milk, Soy 等
- FilterInputStream 类 有 protected volatile InputStream in; 即含被装饰者,类似前面的obj
- 分析得出在 jdk 的 io 体系中,就是使用装饰者模式
星巴克咖啡订单项目(咖啡馆)
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