zoukankan      html  css  js  c++  java
  • JS模式--装饰者模式

    • 在Javascript中动态的给对象添加职责的方式称作装饰者模式。
    • 下面我们通常遇到的例子:
    var a = function () {
                alert(1);
            };
    //改成:
    var a = function () { alert(1); alert(2); };
    • 用装饰者模式,在不改原来函数的基础上,我们增加自己的新功能。
     
            var a = function () {
                alert(1); 
            };
            var _a=a;
            a=function(){
             _a();
             alert(2);
           }
    a();
     var Plane = function () { };
    
            Plane.prototype.fire = function () {
                console.log("发射普通子弹");
            };
    
            var MissileDecorator = function (plane) {
                this.plane = plane;
            };
            MissileDecorator.prototype.fire = function () {
                this.plane.fire();
                console.log("发射导弹");
            };
            var AtomDecorator = function (plane) {
                this.plane = plane;
            };
            AtomDecorator.prototype.fire = function () {
                this.plane.fire();
                console.log("发射原子弹");
            };
            var plan = new Plane();
            plan = new MissileDecorator(plan);
            plan = new AtomDecorator(plan);
    
            plan.fire();
            /*
            发射普通子弹
            发射导弹
            发射原子弹
            */
    • 这种给对象动态增加职责的方式,并没有真正地改动对象自身,而是将对象放入另一个对象之中,这些对象以一条链的方式进行引用,形成一个聚合对象。
    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();
            /*
           发射普通子弹
           发射导弹
           发射原子弹
           */
    •  我们在实际开发过程当中,想给window绑定onload事件,但是又不确定这个事件有没有被其他人已经给绑定过,
    • 为了避免覆盖掉原来的window.onload函数中的行为,我们就用装饰者模式,先将原来的函数保存起来,再把它放入新的函数中执行。
    window.onload = function () {
                alert(1);
            };
            var _onload = window.onload || function () { };
    
            window.onload = function () {
                _onload();
                alert(2);
            };
  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/meiyh/p/6513633.html
Copyright © 2011-2022 走看看