设计模式学习(四):Decorator
说明:由于本人是一个初学者,所以博客中用到的一些见解、图片、代码或者说明可能引用网络上面的资源,如果涉及到了侵权的问题请大家联系我进行删除。
之前我们已经学习完了三个“组件协作”模式,接下来我们将进行“单一职责”模式的学习。
“单一职责”模式:
在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复的代码,这时候的关键是划清责任。
“单一职责”模式的典型模式包括Decorator和Bridge模式,但是这不意味着其他模式没有责任问题,只是因为这两个模式在责任问题上表现得极其突出。
这一篇博客主要进行Decorator(装饰器)模式的学习。
动机
在某些情况下我们可能会”过度地使用继承来扩展对象的功能“,由于继承为类型引入的静态特质(有些代码是稳定不变的),使得这种扩展方法缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
如何使“对象功能的扩展”能够根据需要来动态的实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响降为最低?
举例
用装饰模式实现游戏角色“莫莉卡·安斯兰”的变身。
分析:在《恶魔战士》中,游戏角色“莫莉卡·安斯兰”的原身是一个可爱少女,但当她变身时,会变成头顶及背部延伸出蝙蝠状飞翼的女妖,当然她还可以变为穿着漂亮外衣的少女。这些都可用装饰模式来实现,在本实例中的“莫莉卡”原身有 setImage(String t) 方法决定其显示方式,而其 变身“蝙蝠状女妖”和“着装少女”可以用 setChanger() 方法来改变其外观,原身与变身后的效果用 display() 方法来显示,本例的结构图如下:
从图中我们可以看出,Changer类就是本例中的装饰器类。
模式定义
动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。
要点总结
通过采用组合而非继承的手法,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component 的组合关系,即Decorator类又使用了另外一个component类。(技巧:当一个类既继承和组合了一个相同的类,那么这个类大概率的使用了Decorator模式。)
Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。
设计模式学习(四):Decorator相关推荐
- 设计模式学习笔记清单
设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累. ...
- 设计模式学习笔记——装饰(Decorator)模式
设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...
- 设计模式学习(四):Strategy策略模式
一.什么是Strategy模式 Strategy的意思是"策略",指的是与敌军对垒时行军作战的方法.在编程中,我们可以将它理解为"算法".无论什么程序,其目的都 ...
- 设计模式学习(四):基于Builder模式的歌词解析器
一.前言 上篇文章(设计模式学习(三):生成器(Builder)模式)记录了 Builder 模式的具体内容,这次使用C语言来实现一个实际的例子--基于Builder模式的歌词解析器. 本文的示例来自 ...
- 步步为营 .NET 设计模式学习笔记系列总结
设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...
- 设计模式学习(三):Adapter适配器模式
一.什么是Adapter模式 我们先举个例子:如果想让额定工作电压是直流12V的笔记本电脑在交流220V的电源下工作,应该怎么做呢?通常,我们会使用适配器,将家庭用的交流220V电压转换成我们所需要的 ...
- 步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)
园子里讲设计模式的太多了,最近我也在学设计模式,把我自己练的一些代码整理下,写个.NET设计模式学习笔记来让自己在设计模式的功底更深一层. 记得金庸小说里风清扬教令狐冲的时候,说过独孤九剑的总纲,无招 ...
- java/android 设计模式学习笔记(7)---装饰者模式
这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
- 设计模式(四)--代理模式
设计模式(四)–代理模式 文章目录 设计模式(四)--代理模式 其他链接 代理模式 1.简介 2.静态代理 角色 代码实现 好处 3.动态代理 代码实现 解析 其他链接 JVM学习笔记(一) JVM学 ...
最新文章
- com.sun.crypto.provider.SunJCE
- Tensorflow【实战Google深度学习框架】全连接神经网络以及可视化
- Xcode10 闪退问题
- 【AWSL】之Linux常用命令,学习Linux,这一篇就够了(type、echo、enable、du、ls、mkdir、touch、ln、cp、rm、mv、find、gzip、bzip、tar)
- Vuex State模块化
- apache实验报告 linux_Linux实验报告
- AT0 Intrudoction
- 使用严苛模式打破Android4.0以上平台应用中UI主线程的“独断专行”
- stdafx.h作用以及include中为何iostream必须放在stdafx.h之后?
- JavaScript封装对象和类
- 2019年 Paypal怎么提现
- 写给理工科人看的乐理(二)十二平均律与五线谱
- 拿什么拯救你的硬盘?十大绝招帮你忙
- 2019-11-29-win10-uwp-如何开始写-uwp-程序
- 24.树莓派交叉编译工具链的安装
- d3.js环形统计图代码
- 系统设计:在线支付系统的需求分析报告
- STL 大锅炖(一):什么是 STL
- 转战 GithubPages
- 阴天(唐伯虎点秋香版)1铃声 阴天(唐伯虎点秋香版)1手机铃声免...