第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. 非常全面的SQL Server巡检脚本来自sqlskills团队的Glenn Berry 大牛
  2. Node.js学习笔记
  3. iOS开发之SQLite--C语言接口规范(四) —— Result Values From A Query
  4. Tomcat 启动提示未发现 APR 的解决方法
  5. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
  6. 无法启动:此实现不是Windows平台FIPS验证的加密算法的一部分
  7. 【BZOJ】【1096】【ZJOI2007】仓库建设
  8. VisionTimer BUG && Start
  9. 30 个最棒的 jQuery 的拖放插件
  10. 成为Web开发人员的7个简单步骤
  11. ChatCell
  12. 纯CSS设置Checkbox复选框控件的样式
  13. 微信JS-SDK 选取手机照片并进行上传
  14. python中type dtype astype 的用法
  15. SharePoint 2010 -- .Net托管客户端模型简单示例
  16. 转 InnoDB索引
  17. java学习(五)
  18. Mac下搭建solr搜索引擎与PHP扩展开发(上)
  19. kubernetes集群搭建(7):常见问题及处理
  20. Linux/CentOS下安装MySql RPM Bundle

热门文章

  1. php.ini配置文件中的session配置
  2. 如何用VMware打开vmdk文件
  3. 遍历Map和List的几种方法和性能比较
  4. 浅谈IOC
  5. CentOS7.2上用KVM安装虚拟机window10踩过的坑
  6. JAVA基础——异常详解
  7. Centos 6.x 部署pptp VPN
  8. wifi扩展设置
  9. 面向对象15.2String类-构造函数
  10. 安装Scala-2.11.7——集群学习日记