一.命令模式
命令模式,封装了方法调用细节,以解耦请求者与执行者
(引自黯羽轻扬:设计模式之命令模式(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设计模式》