装饰模式:Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的.

Decorator定义:
动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.

使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能.

[简易实例]

<script type="text/javascript">var f = function() {alert('原有函数');}var _f = f;f = function() {alert('执行前置包装函数');_f();alert('执行后置包装函数');}f();
</script>

[常用实例] ---- 多重onload绑定

<script type="text/javascript">
function addLoadEvent(fn) {var oldEvent = window.onload;if(typeof window.onload != 'function') {window.onload = fn;}else {window.onload = function() {oldEvent();fn();}}
}
function fn1() {alert('加载一');
}
function fn2() {alert('加载二');
}
function fn3() {alert('加载三');
}
addLoadEvent(fn1);
addLoadEvent(fn2);
addLoadEvent(fn3);
</script>

[扩展实例]

<script type="text/javascript">
// 被刷油漆者
Decoratee = function() {alert('被刷油漆');
}
// 刷油漆工
Decorator = {beginList: [],    // 前置函数列表endList: [],    // 后置函数列表append: function(fn) {this.endList.push(fn);},before: function(fn) {this.beginList.splice(0, 0, fn);},wrap: function(fn/* 要被修饰的函数体 */) {var $ = this, $1 = [], $2 = [];// 包装前置函数for(var i = 0, len = $.beginList.length; i < len; i++) {$1[i] = $.beginList[i];}// 包装后置函数for(var i = 0, len = $.endList.length; i < len; i++) {$2[i] = $.endList[i];}try {return function(){for(var i = 0, len = $1.length; i < len; i++) {$1[i]();}if(typeof fn == 'function') fn();for(var i = 0, len = $2.length; i < len; i++) {$2[i]();}}}finally {this.beginList.length = this.endList.length = 0;}}
}Decorator.before(function() { alert('刷油漆前先钉木头') });
Decorator.before(function() { alert('刷油漆前先钉钉子') });
Decorator.append(function() { alert('刷油漆后要晾干') });
Decorator.append(function() { alert('刷油漆后要涂鸦') });
Decorator.wrap(Decoratee)(); // 开始刷油漆
</script>

转载于:https://www.cnblogs.com/bluedream2009/archive/2010/01/31/1660673.html

javascript装饰者模式相关推荐

  1. JavaScript装饰器模式

    装饰器模式 适配器模式是原来的接口就不能用了,需要做一个适配之后才能继续使用. 装饰器是原先接口还能用,在此基础上添加一些新功能.(为对象添加新功能,并且不改变原有结构和功能) 下面我们来举一个装饰器 ...

  2. 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式

    在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方面,继承这种功能复 ...

  3. php和python对比-PHP、Python和Javascript的装饰器模式对比

    修饰模式(Decorator Pattern),又叫装饰者模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式.就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个 ...

  4. javascript设计模式之装饰器模式(结构型模式)

    javascript设计模式之装饰器模式 js的设计模式分为创建型模式,结构型模式和行为模式 结构模式描述了如何组合对象以提供新的功能. 装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础 ...

  5. JavaScript设计模式(三):结构型设计模式-外观模式、适配器模式、代理模式、装饰者模式、桥接模式、组合模式、享元模式

    JavaScript设计模式 - 结构型设计模式 套餐服务-外观模式 外观模式(Facade) 水管弯弯-适配器模式 适配器模式(Adapter) 适配异类框架 参数适配 牛郎织女-代理模式 代理模式 ...

  6. Javascript 装饰器极速指南

    pablo.png Decorators 是ES7中添加的JavaScript新特性.熟悉Typescript的同学应该更早的接触到这个特性,TypeScript早些时候已经支持Decorators的 ...

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

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

  8. 使用装饰者模式做有趣的事情

    什么是装饰者模式 装饰者模式是一种为函数或类增添特性的技术,它可以让我们在不修改原来对象的基础上,为其增添新的能力和行为.它本质上也是一个函数(在javascipt中,类也只是函数的语法糖). 我们什 ...

  9. JavaScript享元模式

    JavaScript享元模式 通过两个例子的对比来凸显享元模式的特点:享元模式是一个为了提高性能(空间复杂度)的设计模式,享元模式可以避免大量非常相似类的开销. 第一实例,没有使用享元模式,计算所花费 ...

最新文章

  1. php输出带的字符串吗,php输出含有“#”字符串的方法
  2. 小心!你的脸正在成为色情片主角……
  3. python生产和消费模型_python queue和生产者和消费者模型
  4. ES logstash7.4.2 mysql 数据同步
  5. 【支付专区】之解析微信支付返回xml
  6. Ubuntu20.04中安装shutter
  7. SVN和Git 介绍,区别,优缺点以及适用范围
  8. Java Swing模型视图适配器介体
  9. latext配置 vscode_新手关于在VScode上配置latex的事情
  10. 【kafka】kafka 查看 GroupCoordinator 以及 kafka Group dead 消费组死掉 以及 GroupCoordinatorRequest 使用
  11. php将简单的数据从数据库,php将session保存到数据库的简单示例
  12. 商业计划书范文3000_餐厅 餐饮 饭店项目商业计划书模板范文
  13. 百度百科创建个人词条怎么写?
  14. org.quartz.JobPersistenceException: Couldn‘t store job:
  15. 大数据转型方案:首推数据湖!
  16. 优质开源:共享图书小程序3.0 全新UI 免费下载
  17. 解决GitHub release下载慢、clone和push慢的问题
  18. Windows安装及卸载CUDA
  19. C# 调用xktComm 与西门子PLC通讯
  20. java计算机毕业设计网上宠物售卖平台源码+系统+mysql数据库+LW文档+部署文件

热门文章

  1. 蛋白质浓度与盐胁迫的关系_[202009024]巨大狼尾草:一种新兴的盐积累/耐盐的非传统作物,可用于可持续的盐碱农业和同步的植物修复...
  2. 执行应用程序出现: No such file or directory
  3. 数据结构-----基于双数组的Trie树
  4. Linux下的FTP命令害死人
  5. 让VC程序在Win7下获得管理员权限
  6. hh.exe反汇编chm
  7. 关于 richedit 控件
  8. 常用的汇编系统功能指令(包含字符功能类,中断终止类)
  9. 优先队列/单调队列 - 滑动窗口最大值
  10. POJ 3258 -- River Hopscotch(二分)