HeadFisrt 设计模式03 装饰者
类应该对扩展开放, 对修改关闭.
所谓装饰者模式, 是指用其他的类来装饰某个类,
装饰者说白了就是使用 has-a 来代替 is-a
隐喻
咖啡店, 有很多种咖啡, 咖啡里还要增加一些 milk, 面包片啊, 等等. 针对加的东西不同, 计算出来的费用不同, 那么我们需要怎么做呢?
1. 首先创建一个 coffee 基类(有抽象的cost方法)
2. 黑咖啡, 原味咖啡, 等咖啡继承 coffee 基础类, 是 is-a的关系
3. 创建一个装饰基础类, 用来装饰咖啡( 有抽象的cost方法)
3. milk, 面包片等是用来装饰咖啡的, 比如黑咖啡中加入milk, 所以继承装饰基类
好处
比如你计算费用时, 所有装饰者的费用自己就可以调用计算.
HeadFisrt 设计模式03 装饰者的更多相关文章
- java设计模式03装饰者者模式
动态地给一个对象添加一些额外的职责.就增加功能来说, Decorator模式相比生成子类更为灵活.该模式以对客 户端透明的方式扩展对象的功能. (1)在不影响其他对象的情况下,以动态.透明的方式给单个 ...
- Head First 设计模式 —— 03. 装饰器 (Decorator) 模式
思考题 有如下类设计: 如果牛奶的价钱上扬,怎么办?新增一种焦糖调料风味时,怎么办? 造成这种维护上的困难,违反了我们之前提过的哪种设计原则? P82 取出并封装变化的部分,让其他部分不收影响 多用组 ...
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- C#设计模式(9)——装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
- 设计模式之装饰者模式-java实例
设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- 设计模式:装饰器(Decorator)模式
设计模式:装饰器(Decorator)模式 一.前言 装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...
- 设计模式之装饰(Decorator)模式
设计模式之装饰(Decorator)模式 (一)什么是装饰(Decorator)模式 装饰模式,又称为包装模式,它以对客户端透明的方式扩张对象的功能,是继承关系的替代方案之一. 装饰模式可以在不使用创 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
随机推荐
- 网络地址转换相关函数使用(inet_addr,inet_ntoa,inet_addr)
aa 相关函数原型及参数类型: 函数原型:int inet_aton(const char *cp, struct in_addr *inp); in_addr_t inet_addr(const c ...
- python 利用 setup.py 手动安装第三方类库
python 利用 setup.py 手动安装第三方类库 由于我在mac使用时,装了python3,默认有python2的环境,使用 pip 安装第三方类库时,老是安装到 python2的环境上: 在 ...
- Github.com sshkey 生成与添加
大致流程是先在你电脑上生成的一个ssh key 然后把key 加到github.com上你个人帐户的设置里面 cd ~/.ssh 如果你的电脑上还没有.ssh目录 ssh-keygen -t rsa ...
- android studio提示信息乱码解决方法
在build.gradle文件中加上 android {compileOptions.encoding = "GBK"}就好了
- 定制ADempiere(1)- 会议记录
本文是<ADempiere 3.6 Cookbook>一书的实例笔记,详细内容请查阅该书完整内容. 1. 登录pgAdmin III,创建表c_mom: CREATE TABLE adem ...
- JSP页面输出的几种方式:
1. 内置九大对象之out 下载图片 2. <%= %> JSP输出表达式 JSP中出现大量脚本 3. response.getWriter() n ...
- 查看Linux磁盘空间大小命令
发表于:2012-09-17 10:25 查看Linux磁盘空间大小 一.df 命令: df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文 ...
- Android--从路径中提取文件名
方法一:利用String类 public String getFileName(String pathandname){ int start=pathandname.lastIndexOf(" ...
- 公众号的TOKEN配置PHP代码
1.在后台添加好URL和TOKEN和生成43位随机码 注意域名URL需要备案 2.上传到服务器 3.公众号后台要点提交即可 error_reporting(0); $signature=$_REQU ...
- winform程序textbox滚动条保持在最下面 内容不闪烁
在开发winform程序时,会用到textbox控件来显示信息,当把textbox的Multiline属性改为Ture时(即多行显示状态),ScrollBars属性改为Vertical(内容过多时,显 ...