Head First 设计模式 第3章 装饰者模式
第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章的工厂模式会在最近几天更新....
谢谢阅读
转载请表明出处。
Head First 设计模式 第3章 装饰者模式的更多相关文章
- php设计模式课程---7、装饰器模式如何使用
php设计模式课程---7.装饰器模式如何使用 一.总结 一句话总结: 装饰器的核心是获取了文章类整个类,而不是获取了文章内容,有了这个文章类,我想给你加多少装饰就给你加多少装饰(将文章这个类封装进去 ...
- 设计模式(八)装饰器模式Decorator(结构型)
设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...
- 大型Java进阶专题(八)设计模式之适配器模式、装饰者模式和观察者模式
前言 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式. ...
- 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)
<?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...
- 【设计模式 - 9】之装饰者模式(Decorator)
1 模式简介 装饰者模式允许向一个现有的对象添加新的功能,同时又不改变其结构. 装饰者模式的思路是用"调料"对象将原始对象进行层层包裹,同时其属性.动作层层传递,达到最终 ...
- headfirst设计模式(3)—装饰者模式
序 好久没写设计模式了,自从写了两篇之后,就放弃治疗了,主要还是工作太忙了啊(借口,都是借口),过完年以后一直填坑,填了好几个月,总算是稳定下来了,可以打打酱油了. 为什么又重新开始写设计模式呢?学习 ...
- C#设计模式(11)——装饰者模式
1.装饰者模式介绍 装饰者顾名思义就是对一个类添加一些额外的装饰(功能).我们想给一个对象添加一些额外的功能又不改变对象内方法的签名怎么做呢?最常用的方法就是继承了,子类继承父类,然后重写父类的方法. ...
- 《大话设计模式》c++实现 装饰者模式
一.UML图 介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创 ...
- 设计模式(九)装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
随机推荐
- 什么是VPN,VPN有什么用,怎么获得VPN
什么是VPN? VPN英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.vpn被定义为通过一个公用网络(通常是因特网)建立一个临时的.安全的连接,是一条穿过混 ...
- Java 获取字符串Hash值
Java 生成字符串的Hash值: /** * A hashing method that changes a string (like a URL) into a hash suitable for ...
- 使用Gulp实现前端构建自动化
使用Gulp实现前端构建自动化 安装 一.安装NodeJs Gulp的安装依赖于NodeJs的npm安装管理器 安装包下载地址 关于npm命令: 1. npm install <name> ...
- Unity 游戏框架搭建 (四) 简易有限状态机
为什么用有限状态机? 之前做过一款跑酷游戏,跑酷角色有很多状态:跑.跳.二段跳.死亡等等.一开始是使用if/switch来切换状态,但是每次角色添加一个状态(提前没规划好),所有状态处理相关的代码 ...
- 接水问题【NOIP2010普及组】优先队列
题目描述 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1. 现在有 n 名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从 1到 n ...
- (转载)CloseableHttpClient设置Timeout
参考文档: http://blog.csdn.net/zheng0518/article/details/46469051 https://segmentfault.com/a/11900000005 ...
- Vue.js 基本功能了解
一.写在前面 隔了这么久才来出Vue的第二篇文章,真是堕落了,自己先惩罚下/(ㄒoㄒ)/~~ 回过头看自己第一篇相关文章<初试 Vue.js>(http://www.cnblogs.com ...
- Mac之OS系统下搭建JavaEE环境 <二> 之Tomcat 的安装配置
二.Tomcat的安装与配置 1.下载Tomcat 找到Tomcat的官网 百度搜索Tomcat 点击下载即可 下载网址:http://tomcat.apache.org/download-80.cg ...
- java 网络编程 UDP TCP
网络编程 网络编程主要用于解决计算机与计算机(手机.平板..)之间的数据传输问题. 网络编程: 不需要基于html页面就可以达到数据之间的传输. 比如: feiQ , QQ , 微信....网页编程: ...
- mac重开电脑后显示重装提示解决办法
情况描述: mac昨天电脑关闭后 第二天打开电脑就显示语言选择安装语言 解决办法: 1 出现语言安装提示界面 我们选择简体中文 2 出现苹果密码登陆 我们选择下面的按钮点击退出 这样就可 ...