声明:这个系列为阅读《JavaScript设计模式与开发实践》 —-曾探@著一书的读书笔记


装饰者模式的定义:

装饰者(decorator)模式能够在不改变对象自身的基础上,在程序运行期间给对像动态的添加职责。与继承相比,装饰者是一种更轻便灵活的做法。

装饰者模式的特点:

可以动态的给某个对象添加额外的职责,而不会影响从这个类中派生的其它对象;

继承的一些缺点:

  1. 继承会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之改变;
  2. 超类的内部细节对于子类是可见的,继承常常被认为破坏了封装性;

传统面向对象的装饰者和JavaScript装饰者对比:

1.模拟传统面向对象语言的装饰者模式

//模拟传统语言的装饰者//原始的飞机类
var Plan = function () {};Plan.prototype.fire = function () {console.log('发射普通子弹');
};//装饰类
var MissileDecorator = function (plan) {this.plan = plan;
}MissileDecorator.prototype.fire = function () {this.plan.fire();console.log('发射导弹!');
};var plan = new Plan();
plan = new MissileDecorator(plan);
plan.fire();

2.JavaScript中的装饰者模式

装饰者模式将一个对象嵌入到另一个对象之中,实际上相当于这个对象被另一个对像包装起来,形成一条包装链。请求随着这条包装链依次传递到所有的对象,每个对象都有处理这条请求的机会。


var Plan1 = {fire: function () {console.log('发射普通的子弹');}
};var missileDecorator= function () {console.log('发射导弹!');
};var fire = Plan1.fire;Plan1.fire=function () {fire();missileDecorator();
};Plan1.fire();

装饰函数

在JavaScript中可以很方便的给某个对象扩展属性和方法,但却很难在不改动某个函数源代码的情况下,给该函数添加一些额外的功能。也就是在代码运行期间,我们很难切入某个函数的执行环境

1.使用装饰者模式例子

//对window.onload的处理window.onload=function () {console.log('test');
};var  _onload= window.onload || function () {};window.onload=function () {_onload();console.log('自己的处理函数');
};

2.使用AOP(面向切面编程)装饰函数

主要是以为在JavaScript中会存在随着函数的调用,this的指向发生变化,导致执行结果发生变化。

2.1.封装的before函数

在需要执行的函数之前执行某个新添加的功能函数

//是新添加的函数在旧函数之前执行
Function.prototype.before=function (beforefn) {var _this= this;                               //保存旧函数的引用return function () {                           //返回包含旧函数和新函数的“代理”函数beforefn.apply(this,arguments);            //执行新函数,且保证this不被劫持,新函数接受的参数// 也会被原封不动的传入旧函数,新函数在旧函数之前执行return _this.apply(this,arguments);};
};
2.2.封装的after函数

在需要执行的函数之后执行某个新添加的功能函数


//新添加的函数在旧函数之后执行
Function.prototype.after=function (afterfn) {var _this=this;return function () {var ret=_this.apply(this,arguments);afterfn.apply(this,arguments);return ret;};
};
2.3.不污染Function原型的做法
var before=function (fn, before) {return function () {before.apply(this,arguments);return fn.apply(this,arguments);};
};function func1(){console.log('1')}
function func2() {console.log('2')}var a=before(func1,func2);// a=before(a,func1);
a();

装饰者模式用法示例:

1.ajax动态添加参数

使用装饰者模式动态的改变ajax函数,传输的参数

//是新添加的函数在旧函数之前执行
Function.prototype.before=function (beforefn) {var _this= this;                               //保存旧函数的引用return function () {                           //返回包含旧函数和新函数的“代理”函数beforefn.apply(this,arguments);            //执行新函数,且保证this不被劫持,新函数接受的参数// 也会被原封不动的传入旧函数,新函数在旧函数之前执行return _this.apply(this,arguments);};
};var func = function (param) {console.log(param);
};func = func.before(function (param) {param.b = 'b';
});func({b:'222'});//给ajax请求动态添加参数的例子
var ajax=function (type,url,param) {console.log(param);
};var getToken=function () {return 'Token';
};ajax=ajax.before(function (type, url, param) {param.token=getToken();
});ajax('get','http://www.jn.com',{name:'zhiqiang'});

2.表单验证并且提交

装饰者模式分离表单验证和提交的函数

Function.prototype.before=function (beforefn) {var _this= this;                               //保存旧函数的引用return function () {                           //返回包含旧函数和新函数的“代理”函数beforefn.apply(this,arguments);            //执行新函数,且保证this不被劫持,新函数接受的参数// 也会被原封不动的传入旧函数,新函数在旧函数之前执行return _this.apply(this,arguments);};
};var validata=function () {if(username.value===''){alert('用户名不能为空!')return false;}if(password.value===''){alert('密码不能为空!')return false;}
}var formSubmit=function () {var param={username=username.value;password=password.value;}ajax('post','http://www.mn.com',param);
}formSubmit= formSubmit.before(validata);submitBtn.onclick=function () {formSubmit();
}

总结:

装饰者模式和代理模式的区别:
1. 代理模式的目的是,当直接访问本体不方便或者不符合需要时,为这个本体提供一个代替者。本体定义了关键功能,而代理提供了或者拒绝对他的访问,或者是在访问本体之前做一些额外的事情。
2. 装饰者模式的作用就是为对象动态的加入某些行为。


JavaScript设计模式----装饰者模式相关推荐

  1. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  2. [Head First设计模式]山西面馆中的设计模式——装饰者模式

    原文:[Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 在山西面馆吃鸡蛋面的时候突然想起装饰者这个模式,觉得面馆这个场景跟书中的星巴兹咖啡的场景很像,边吃边思考装饰者模式.这里 ...

  3. 设计模式——装饰者模式

    本文是阅读 Head First 设计模式--装饰者模式的总结. 这本书的教学模式很不错,个人很喜欢,由实际的案例由浅入深,循序渐进的让你明白良好的设计是多么的优雅迷人(回头看看自己的代码,WTF!) ...

  4. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  5. 设计模式装饰者模式_装饰者模式如何拯救了我的一天

    设计模式装饰者模式 在工作中,我正在处理庞大的Java代码库,该代码库是由许多不同的开发人员在15年的时间里开发的. 并不是所有的事情都由书来完成,但是同时我通常无法重构遇到的每一个奇怪的事物. 尽管 ...

  6. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  7. Javascript 设计模式之代理模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之代理模式[讲师辅导]-969人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  8. Javascript 设计模式之外观模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之外观模式[讲师辅导]-770人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  9. 读书笔记---Head First 设计模式--- 装饰者模式

    读书笔记-Head First 设计模式- 装饰者模式 装饰者模式(Decorator Pattern) 装饰者模式--动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. ...

  10. Go 设计模式 - 装饰器模式

    装饰模式使用对象组合的方式动态改变或增加对象行为.Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式.使用匿名组合,在装饰器中不必显式定义转调原对象方法. 设计模式 装饰器模式 装饰器模式主要 ...

最新文章

  1. 网络工程师_记录的一些真题_2007下半年上午
  2. 阿里云视频点播获取视频点播的video信息
  3. 关于分页插件PageHelper不起作用的问题
  4. java 返回空数组_避免在Java中检查Null语句
  5. Flutter+FaaS一体化任务编排的思考与设计
  6. ELASTIC API
  7. Objective-C模版方法(TemplateMethod)
  8. 破解mysql数据库的密码
  9. 数据结构-图的基础代码
  10. Unix 网络编程 读书笔记1
  11. php小论坛开发总结,PHP开发 小型论坛教程之添加论坛-2
  12. Golang + Qt5 桌面开发终极解决方案
  13. aspose.words生成pdf字体乱码为方框
  14. Theano入门神经网络(三)
  15. Python高速缓存和会话库——Beaker
  16. 爱加密加固病毒分析-脱壳篇
  17. Linux/Unix下Shell快捷键操作大集合
  18. spring mvc 响应处理post请求和get请求 测试
  19. 计算机右键无法新建excel,电脑右键新建没有excel表格
  20. 使用 Let's Encrypt 的免费HTTPS服务

热门文章

  1. 华三交换机ping大包命令_华三(H3C)交换机命令大全
  2. 物联网解决方案:智慧物流方案
  3. (附源码)Springboot小型仪器公司生产管理系统 毕业设计 031853
  4. c语言正三角形编程plc,02-C语言实现一个简单PLC仿真小程序(下)
  5. 游戏毕业设计参考文献合集
  6. [嵌入式linux]RTL8111/RTL8168网卡内核驱动安装
  7. 功能结构图、信息结构图、结构图的区别
  8. 短期刚需还是未来趋势? 聚焦音视频技术发展方向
  9. 信息学奥赛一本通(C++版)在线评测系统 1161:转进制
  10. 【计算机专业日志100篇ctrlc、ctrlv】