装饰者模式就是一种给对象动态添加职责的模式。装饰者模式能够在不改变对象自身的情况下,在程序运行期间动态的给对象添加职责。
我们可以使用AOP来装饰函数:
Function.prototype.before = function(beforeFunc) {
var _self = this; // 保存原函数的引用
return function() { // 返回包含原函数和新函数的代理函数
beforeFunc.apply(this, arguments); // 执行新函数,保证this不被劫持,并将参数传入
var ret = _self.apply(this, arguments); // 执行原函数,保证this不被劫持
return ret;
}
}
Function.prototype.after = function(afterFunc) {
var _self = this;
return function() {
var ret = _self.apply(this, arguments);
afterFunc.apply(this, arguments);
return ret;
}
}
装饰者模式和代理模式的结构看起来非常相像,这两种模式都描述了怎样为对象提供一定程度上的间接引用,它们的实现部分都保留了对另外一个对象的引用,并且向那个对象发送请求。
代理模式和装饰者模式最重要的区别在于它们的意图和设计目的。
代理模式的目的是,当直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者。本体定义了关键功能,而代理提供或拒绝对它的访问,或者在访问本体之前做一些额外的事情。
装饰者模式的作用就是为对象动态加入行为。换句话说,代理模式强调一种关系(Proxy 与它的实体之间的关系),这种关系可以静态的表达,也就是说,这种关系在一开始就可以被确定。而装饰者模式用于一开始不能确定对象的全部功能时。代理模式通常只有一层代理本体的引用,而装饰者模式经常会形成一条长长的装饰链。