命令模式_JavaScript设计模式7

一.命令模式

命令模式,封装了方法调用细节,以解耦请求者与执行者

(引自黯羽轻扬:设计模式之命令模式(Command Pattern)

这就是命令模式的核心,在调用者和执行者之间插入命令层,先前的调用者就变成请求者了,不直接调用执行者,而是向系统发出命令请求;此时系统变成了调用者,负责调度命令(直接发送给执行者,或者加以控制,在满足一定条件时再发);执行者还是执行者,只是与先前的调用者解除耦合关系了

二.经典实现方式

Java实现请查看黯羽轻扬:设计模式之命令模式(Command Pattern)

文中例子给的非常恰当,无须赘述

三.JavaScript实现命令模式

JavaScript实现其实是一个简化版,功能相对弱一些,但实现起来相当简单,示例代码如下:

var module = {
    // 命令(统一入口)
    exec: function(cmd) {
        /**
         * Array.prototype.slice.call(arguments, 1)是一个小技巧
         * 用来把arguments对象转换为数组并切掉第一个参数(此处是cmd的值)
         */
        return this[cmd] && this[cmd].apply(this, Array.prototype.slice.call(arguments, 1));
    },
    // 公开接口1
    sum: function(a, b) {
        return a + b;
    }
    // 公开接口2...
}
var sum = module.exec('sum', 1, 2);
console.log(sum);   // 3

这样的实现相当简洁(我们的命令模式只有一行代码),没有必要模拟出经典实现中用于约束类型的多余抽象

四.命令模式与外观模式

仔细一想,这不和外观模式一样嘛,都是对现有接口进行封装。确实很相似,唯一的差异是命令模式侧重于提供统一入口(加以控制),而外观模式是为了让接口更加易用对现有接口进行二次封装(不一定非要统一一个入口,完全可以提供一组新接口)

可以这样理解,如果外观提供的接口只有一个,此时就是命令模式了。对现有接口进行封装后提供的新接口的个数是区分二者的关键,命令模式只能有一个(示例中的exec),外观模式没有限制,只要新接口比原接口好用就行

参考资料

  • 《JavaScript设计模式》

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code