js设计模式——装饰者模式

装饰者模式:根据个人理解,所谓装饰者模式就是在实例层面上重写方法……

摘自tom大叔博客:

装饰者提供比继承更有弹性的替代方案。 装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数)。

装饰者是一种实现继承的替代方案。当脚本运行时,在子类中增加行为会影响原有类所有的实例,而装饰者却不然。取而代之的是它能给不同对象各自添加新行为。

先看继承代码:

function Macbook(){
        this.cost = function(){return 997;};
        this.screenSize = function(){return 11.6;};
    }
    Memory.prototype = new Macbook();
    Insurance.prototype = new Macbook();
    //加内存版
    function Memory(){
        this.cost = function(){
            return 1072;
        };
    }
    //保险版
    function Insurance(){
        this.cost = function(){
            return 1247;
        };
    }
    var mb1 = new Memory();
    console.log(mb1.cost());    //1072
    var mb2 = new Insurance();
    console.log(mb2.cost());    //1247

(1)Memory和Insurance继承了Macbook,成为其子类。并在子类中重写了cost方法,分别给出了购买加内存和保险版的花费

(2)提出问题:如果现在我们要新增一款内存+保险都有的macbook,如果我们在其中的一个子类里面修改,那么曾经实例化的对象的值都会改变。因此,我们不得不重新写一个类。所以,看下面装饰者模式

再看装饰者模式代码:

装饰者是实现继承的替代方案,可以根据用户的需要进行装饰。

  //摘自javascript设计模式——购买不同版本的Mac需要多少钱
    function Macbook(){
        this.cost = function(){return 997;};
        this.screenSize = function(){return 11.6;};
    }
    //加内存版
    function Memory(macbook){
        this.memorySize = "8MB";
        var v = macbook.cost();
        macbook.cost = function(){
            return v + 75;
        };
    }
    //保险版
    function Insurance(macbook){
        var v = macbook.cost();
        macbook.cost = function(){
            return v + 250;
        };
    }

结果

    var mb1 = new Macbook();
    var mb2 = new Macbook();
    Memory(mb1);
    Insurance(mb1);
    console.log(mb1.cost());    //1322
    console.log(mb2.cost());    //997
    var mb3 = new Memory(new Macbook());
    console.log(mb3.memorySize);//8MB
    console.log(mb3.cost());    //mb3.cost is not a function

有什么好处?

(1)实例化mb1,给mb1同时装饰Memory和Insurance,而不影响其他实例的值。

(2)在我们不需要装饰的时候还可以把他当成一个类来看待。

还没理解透,还没写完

转载于:https://my.oschina.net/wyc1219/blog/830367

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值