12、装饰者模式
给对象动态地增加职责的方式称为装饰者(decorator)模式
js装饰者
js
var plane = {
fire: function(){
console.log( ’发射普通子弹’ );
}
}
var missileDecorator = function(){
console.log( ’发射导弹’ );
}
var atomDecorator = function(){
console.log( ’发射原子弹’ );
}
var fire1 = plane.fire;
plane.fire = function(){
fire1();
missileDecorator();
}
var fire2 = plane.fire;
plane.fire = function(){
fire2();
atomDecorator();
}
plane.fire();
// 分别输出:发射普通子弹、发射导弹、发射原子弹
思路: 想为函数添加一些功能,最简单粗暴的方式就是直接改写该函数,
不足: 但这是最差的办法,直接违反了开放-封闭原则
解决: 保存引用:通过保存原引用的方式就可以改写某个函数
两个问题: 1、中间变量的数量也会越来越多; 2、中间变量的数量也会越来越多
解决:AOP Function.prototype.before接受一个函数当作参数, 这个函数即为新添加的函数,它装载了新添加的功能代码 把当前的this保存起来,这个this指向原函数 返回一个代理函数 请求分别转发给新添加的函数和原函数 实现了动态装饰效果
应用: 数据统计上报 用AOP动态改变函数的参数 插件式的表单验证
对比:
代理模式:
1、直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者 本体定义了关键功能,而代理提供或拒绝对它的访问,或者在访问本体之前做一些额外的事情
2、代理模式强调一种关系(Proxy与它的实体之间的关系),这种关系可以静态的表达,也就是说,这种关系在一开始就可以被确定
3、一层代理-本体的引用
装饰者模式:
1、为对象动态加入行为 2、用于一开始不能确定对象的全部功能时 3、形成一条长长的装饰链