美文网首页前端是万能的
《JavaScript设计模式与开发实践》之装饰者模式

《JavaScript设计模式与开发实践》之装饰者模式

作者: 肆意木 | 来源:发表于2020-01-04 15:47 被阅读0次

    概念:可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象。

    出现原因:在装饰者出现之前,我们都是用继承给对象添加功能,但是继承也不是万能的,会出现一些瑕疵,装饰者模式的出现就恰恰弥补了这些瑕疵。

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

    举栗子(假设我们在编写一个飞机大战的游戏,随着经验值的增加,我们操作的飞机对象可以升级成更厉害的飞机,一开始这些飞机只能发射普通的子弹,升到第二级时可以发射导弹,升到第三级时可以发射原子弹。):

    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();
    // 分别输出: 发射普通子弹、发射导弹、发射原子弹
    

    装饰者模式和代理模式看起来相像,但它们有明显的不同:
    代理模式的目的是,当直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者。本体定义了关键功能,而代理提供或拒绝对它的访问,或者在访问本体之前做一些额外的事情。
    装饰者模式的作用就是为对象动态加入行为,装饰者模式用于一开始不能确定对象的全部功能时。。

    相关文章

      网友评论

        本文标题:《JavaScript设计模式与开发实践》之装饰者模式

        本文链接:https://www.haomeiwen.com/subject/eqtfactx.html