装饰者模式

装饰者模式就是一种给对象动态添加职责的模式。装饰者模式能够在不改变对象自身的情况下,在程序运行期间动态的给对象添加职责。

我们可以使用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 与它的实体之间的关系),这种关系可以静态的表达,也就是说,这种关系在一开始就可以被确定。而装饰者模式用于一开始不能确定对象的全部功能时。代理模式通常只有一层代理本体的引用,而装饰者模式经常会形成一条长长的装饰链。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章