7. Command模式
(1)概念
Command模式把一个请求或操作封装到一个对象中。具体地说,Command模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。Command模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
(2)举例
下面我们通过一个JavaScript计算器程序的设计思路来说明Command模式的应用。
首先,我们马上会想到定义如下的Calculator对象,其中包括了定义四则运算的四个方法。
//加法
add: function(x,y) {
return x+y;
},
//减法
substract: function(x, y) {
return x-y;
},
//乘法
multiply: function(x, y) {
return x*y;
},
//除法
divide: function(x, y) {
return x/y;
},
};
诚然,基于以上的Calculator对象,我们可以直接调用Calculator.add等方法来实现基本的四则运算;但是,在某些情况下我们不希望直接调用Calculator对象内部的方法,因为这样会增加对象之间的依赖关系。也就是说,如果Calculator对象的内部实现发生了变化,那么调用Calculator进行计算的相关程序代码也必须同时进行相应的修改。这样以来,就与面向对象设计中应当尽可能减少对象之间耦合度的理念相违背。
根据设计模式的相关理论,我们可以尝试使用Command模式来改进以上设计。在此,使用Command模式的基本思想是:将任何类型的计算都看作是对Calculator对象的一个请求,请求的内容包括运算的类型和参与运算的操作数。于是,通过如下的代码即可计算出“1+2”的运算结果。
type: “add”, //加法运算
op1:1, //第1个操作数为l
op2:2 //第2个操作数为2
});
根据上面的使用格式,我们可以得到如下所示的Calculator.calc方法定义:
return Calculator[command.type](command.opl,command.op2);
};
这样以来,我们就可以通过如下Calculator.calc方法来实现上述各类运算:
Calculator.calc({type: “Substract”,opl:6,op2:2});//减法运算,返回4
Calculator.calc({type: “multiply”,opl:5,op2:2)); //乘法运算,返回10
Calculator.calc({type: “divide”,opl:8,op2:4));//除法运算,返回2
8. 小结
基于设计模式编程的思想尽管已经提出好几年了,但是仅仅在最近几年才引起第一线开发人员的重视,这从互联网上众多的资料不难得知。设计模式是基于面向对象编程的,因此掌握起来并不容易,特别是它需要在软件开发不断地实践才能最终灵活运用各种设计模式。
设计模式不依赖于任何语言,因此在JavaScript开发中同样适用,仅仅是这方面的资料甚少罢了。本文正是基于客户端常见的JavaScript开发实例,重点讨论了Singleton、Factory Method、Decorator、Observer、Façade、Command共6种典型设计模式的运用。