在《JavaScript设计模式》介绍中,装饰者模式跟Mixin(混入)模式相比,是另一种可行的对象子类化(Mixin模式干的事)的替代方案。
装饰者(Decorator)模式
定义:
给对象动态添加额外的功能。向基本对象添加(装饰)属性或方法,而不是进行子类化,它较为精简。
使用场景:
java IO 流是典型的装饰模式。
PS:应用程序包含需要大量不同类型对象的功能。
例子:
// The constructor to decorate
function MacBook() {this.cost = function () { return 997; };this.screenSize = function () { return 11.6; };
}
// Decorator 1
function memory( macbook ) {var v = macbook.cost();macbook.cost = function() {return v + 75;};
}
// Decorator 2
function engraving( macbook ){var v = macbook.cost();macbook.cost = function(){return v + 200;};
}
// Decorator 3
function insurance( macbook ){var v = macbook.cost();macbook.cost = function(){return v + 250;};
}
var mb = new MacBook();
memory( mb );
engraving( mb );
insurance( mb );
// Outputs: 1522
console.log( mb.cost() );
// Outputs: 11.6
console.log( mb.screenSize() );

装饰并没有重写原始Macbook对象的构造函数方法(如screenSize())、其他属性也一样,依然保持不变并完好无损。
PS:这个里面关键点在于装饰是实例对象,而不是类。
优点:
1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合对象。
缺点:
1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。(这里类是来装饰对象的)
装饰者模式跟混入模式区别
1. 装饰者模式给对象动态增加功能,可以装饰多次。(装饰者模式修改的是实例对象)
PS:装饰可以用类或者实例对象,这里不要误会了。
2. 混入模式综合多个类的功能产生一个类。(混入模式修改的是类)
总结
装饰者模式和混入模式,最终目的都是为了增强对象的功能,只不过增强的手段不一样。另外在JavaScript上使用设计模式,也不必模仿面向对象语言规规矩矩地写(像最上面图示),那就有点僵了。
参考文献
1. 装饰模式 (百度百科)
2. 《JavaScript设计模式》by 徐涛【译】
本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。
本文地址 :http://www.cnblogs.com/lovesong/p/5625245.html

设计模式(十):装饰者模式相关推荐

  1. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  2. 前端也要学系列:设计模式之装饰者模式

    什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...

  3. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  4. 设计模式 之 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对 ...

  5. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )

    文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...

  6. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  7. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  8. 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

    设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用 ...

  9. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

  10. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

最新文章

  1. 查看oralce的版本及安装了哪些选项
  2. You must install #39;hg#39; on your build machine
  3. 最详细的使用 soapui 消费 SAP Cloud for Customer Web service 的教程
  4. PHP基础(必须熟练掌握的基础)
  5. 2021-01-24
  6. Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)设备配对的开发
  7. cas无法使用_【漫画】CAS原理分析!无锁原子类也能解决并发问题!
  8. Windows xp系统Hal.dll文件损坏的解决办法
  9. MVVM绑定多层级数据到TreeView并设置项目展开
  10. vue实现增删改查功能
  11. 容器技术Docker K8s 49 容器镜像服务(ACR)详解-概述
  12. JSP 九大内置对象及四个作用域详解
  13. 微信小程序 实现城市名称拼音搜索框 汉字/拼音(城市区县定位模块)
  14. ExtMail 参数配置指导
  15. 如何将域名和网站转入香港主机
  16. 好记性不如烂笔头。 站在岸上学不会游泳。
  17. excel文档文件加密的方法步骤
  18. 数学建模----LaTex排版使用速成
  19. 关于电脑WLAN突然消失
  20. 算法学习笔记2:凸包及其解法

热门文章

  1. 在线JSON转io-ts工具
  2. 在线图片水印平铺工具
  3. VS2008SP1下jQuery使用初体验
  4. 美国DHS向国会提交政府《移动设备安全研究》报告
  5. 【ora10,4】oracle后台进程介绍:
  6. ABP理论之CSRF
  7. Python asyncio库的学习和使用
  8. ASP.NET DEMO 18: 如何编程动态创建 Menu
  9. Python 入门,看这篇就够了
  10. executorservice 重启_iPhone7使用久了突然手机自动重启,多半原因出在这儿,进来看看...