第3章 装饰者模式

1、定义/说明

  动态、透明的将职责附加到对象上(或从对象上撤销),而不影响其他对象。若要扩展功能,装饰者模式提供了比继承更富有弹性的替代方案。

2、介绍

  首先让我们先来介绍一下场景,EDI_KAI咖啡店开业了,需要有一套咖啡订单系统,以合乎他们的饮料供应需求。

  注意:购买咖啡时,根据客户需要可以在其中加入各种调料,例如,蒸奶(Steamed Milk),豆浆(Soy),摩卡(Mocha也就是巧克力风味)或者覆盖奶泡

  下面是我们的初步设计方案:

  为了设计的健壮性,所以订单系统必须考虑到调料部分,我们的第一个尝试如下:

    每个cost()方法将计算出咖啡加上订单上调料的价钱

  发现设计上有什么问题了吗?这种近似“类爆炸”的设计,后期的维护简直就是噩梦。

  如果我们使用装饰者模式来设计呢?会是什么样子呢?就让我们来看一下吧。

  在这个需求中,总的来说,饮料(也就是咖啡)在确定之后是不会发生变更的,而调料就不一样了,不同的客户在选中同一种饮料之后可能会选择不同的调料,这时候我们就需要拿调料来为饮料调味(也就是我们说的用调料来装饰饮料),所以,我们以饮料为主题,然后在运行时以调料来装饰饮料,调料要继承或实现饮料主题。比方说顾客想要摩卡和奶泡深焙咖啡,我们要做的就是:

    1)、拿一个深焙咖啡(DarkRoast)对象

    2)、以摩卡(Mocha)对象装饰它

    3)、以奶泡(Whip)对象装饰它

    4)、调用cost()方法,并依赖委托(delegate)将调料的加钱加上去

  

  来看一下我们通过装饰者模式设计之后的类图:

  解释下这个类图,其中Beverage(饮料)是一个抽象类或者接口(也就是我们说的主题/或者组件);HouseBlend、DarkRoast、Espresso、Decaf作为具体的饮料(也就是被装饰者)继承自/实现Beverage超类;而CondimentDecorator作为装饰者基类也需要继承/实现Beverage超类,只有这样我们才能在运行时让装饰者去装饰被装饰者,以打到修改被装饰者的目的;Milk、Mocha、Soy、Whip作为具体的装饰者需要继承CondimentDecorator基类。

  顺便说一下,JDK中的I/O就是采用的装饰者模式,如果以前的童鞋对这块不是很明白,在学习了装饰者模式后,估计很快就会明白了

  本章要点:

  Ж 定义:动态、透明的将职责附加到对象上(或从对象上撤销),而不影响其他对象。若要扩展功能,装饰者模式提供了比继承更富有弹性的替代方案

  Ж 应用场景:

  Ж 新设计原则:面向修改关闭,面向扩展开放

  Ж 要慎用装饰者模式,除非必须,过度使用装饰者模式,小对象过多,会使程序变得非常负责。

关于第3章 装饰者模式模式就介绍到这里,如果以上内容有出错的地方,还请不吝赐教;如果大家觉得有讲的不明白地方,也可提出来,大家共同学习。

第4章的工厂模式会在最近几天更新....

谢谢阅读

转载请表明出处。

最新文章

  1. ip封包
  2. 《大象-Think In UML》读书笔记2
  3. 2W+汉字转拼音JS字库(UTF-8生僻字等通用无乱码)
  4. ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component解决
  5. 转!!URL和URI区别
  6. SIP入门(二):建立SIPserver
  7. C++ 11 之初始化
  8. 使用dom4j解析xml文件,并封装为javabean对象
  9. 学习Oracle应该准备的技能
  10. Asp.Net操作WebServices
  11. .net Quartz 服务 作业调度
  12. Python-3------新年考试周的Python学习
  13. python内置方法总结
  14. JMeter接口返回数组键值对校验方法
  15. python---协程 学习笔记
  16. express session 和 socketio session关联
  17. HDU 1426(数独 DFS)
  18. 【工具】idea工具 java代码 gbk转utf8
  19. ApiKernel
  20. header头 下载文件 参数详解

热门文章

  1. Yii 中出现“<?= ... ?>”是什么意思?
  2. 【原创】源码角度分析Android的消息机制系列(六)——Handler的工作原理
  3. iOS 实时录音和播放
  4. 最近快速的过了一遍php基础语法
  5. office 2013幻灯片中插入SmartArt图形时出现错误下列一个或多个文件由于包含错误而无法运行
  6. 学习笔记TF024:TensorFlow实现Softmax Regression(回归)识别手写数字
  7. Java 标准DBUtil 写法
  8. FZU 1015 土地划分
  9. vsftpd3.0之匿名用户配置
  10. Oracle 10gR2分析函数