说明:由于本人是一个初学者,所以博客中用到的一些见解、图片、代码或者说明可能引用网络上面的资源,如果涉及到了侵权的问题请大家联系我进行删除。

之前我们已经学习完了三个“组件协作”模式,接下来我们将进行“单一职责”模式的学习。

“单一职责”模式:
在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复的代码,这时候的关键是划清责任。

“单一职责”模式的典型模式包括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相关推荐

  1. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  2. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  3. 设计模式学习(四):Strategy策略模式

    一.什么是Strategy模式 Strategy的意思是"策略",指的是与敌军对垒时行军作战的方法.在编程中,我们可以将它理解为"算法".无论什么程序,其目的都 ...

  4. 设计模式学习(四):基于Builder模式的歌词解析器

    一.前言 上篇文章(设计模式学习(三):生成器(Builder)模式)记录了 Builder 模式的具体内容,这次使用C语言来实现一个实际的例子--基于Builder模式的歌词解析器. 本文的示例来自 ...

  5. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  6. 设计模式学习(三):Adapter适配器模式

    一.什么是Adapter模式 我们先举个例子:如果想让额定工作电压是直流12V的笔记本电脑在交流220V的电源下工作,应该怎么做呢?通常,我们会使用适配器,将家庭用的交流220V电压转换成我们所需要的 ...

  7. 步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)

    园子里讲设计模式的太多了,最近我也在学设计模式,把我自己练的一些代码整理下,写个.NET设计模式学习笔记来让自己在设计模式的功底更深一层. 记得金庸小说里风清扬教令狐冲的时候,说过独孤九剑的总纲,无招 ...

  8. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  9. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  10. 设计模式(四)--代理模式

    设计模式(四)–代理模式 文章目录 设计模式(四)--代理模式 其他链接 代理模式 1.简介 2.静态代理 角色 代码实现 好处 3.动态代理 代码实现 解析 其他链接 JVM学习笔记(一) JVM学 ...

最新文章

  1. com.sun.crypto.provider.SunJCE
  2. Tensorflow【实战Google深度学习框架】全连接神经网络以及可视化
  3. Xcode10 闪退问题
  4. 【AWSL】之Linux常用命令,学习Linux,这一篇就够了(type、echo、enable、du、ls、mkdir、touch、ln、cp、rm、mv、find、gzip、bzip、tar)
  5. Vuex State模块化
  6. apache实验报告 linux_Linux实验报告
  7. AT0 Intrudoction
  8. 使用严苛模式打破Android4.0以上平台应用中UI主线程的“独断专行”
  9. stdafx.h作用以及include中为何iostream必须放在stdafx.h之后?
  10. JavaScript封装对象和类
  11. 2019年 Paypal怎么提现
  12. 写给理工科人看的乐理(二)十二平均律与五线谱
  13. 拿什么拯救你的硬盘?十大绝招帮你忙
  14. 2019-11-29-win10-uwp-如何开始写-uwp-程序
  15. 24.树莓派交叉编译工具链的安装
  16. d3.js环形统计图代码
  17. 系统设计:在线支付系统的需求分析报告
  18. STL 大锅炖(一):什么是 STL
  19. 转战 GithubPages
  20. 阴天(唐伯虎点秋香版)1铃声 阴天(唐伯虎点秋香版)1手机铃声免...

热门文章

  1. 吉林省计算机二级vf试题,计算机二级vf考试试题
  2. 【转】安装 vim 配色方案 colorscheme 详解
  3. getWay跨域问题,解决方案
  4. chrome浏览器启动时候的默认网页设置不生效怎么解决
  5. 美游客猛增 中国在纽约推介新“丝绸之路”旅游
  6. 小数点后保留两位有效数字 C++
  7. 排序算法 - 堆排序详解
  8. Android仿微信小视频录制功能(二)
  9. BurpSuite如何在各浏览器下配置代理
  10. appium android函数,Appium(一):appium环境以及基础函数的封装