Skip to content

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、形成一条长长的装饰链