闭包实现命令模式

面向对象版本:预先植入的命令接收者被当成对象的属性保存起来

var Tv = {
    open: function() {
        console.log('open tv');
    },
    close: function() {
        console.log('close tv');
    }
};

var OpenTvCommand = function(receiver) {
    this.receiver = receiver;
}

OpenTvCommand.prototype.excute = function() {
    this.receiver.open();
}

OpenTvCommand.prototype.undo = function() {
    this.receiver.close();
}

var setCommand = function(command) {
    document.querySelector('#excute').onclick = function() {
        command.excute();
    };
    document.querySelector('#undo').onclick = function() {
        command.undo();
    };
};

setCommand(new OpenTvCommand(Tv));

闭包版本:命令接收者被封闭在闭包形成的环境中

var Tv = {
    open: function() {
        console.log('open tv');
    },
    close: function() {
        console.log('close tv');
    }
};

var createCommand = function(receiver) {
    var excute = function() {
        receiver.open();
    };
    var undo = function() {
        receiver.close();
    };
    return {
        excute: excute,
        undo: undo,
    };
}

var setCommand = function(command) {
    document.querySelector('#excute').onclick = function() {
        command.excute();
    };
    document.querySelector('#undo').onclick = function() {
        command.undo();
    };
};

setCommand(createCommand(Tv));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容