废话不多说:
命令模式顾名思义:就是通过命令来进行方法的调用,业务的处理。
看以上的uml图,你会觉得十分难看懂,一个简单的命令怎么生出那么多东西呢!!!!
其实我一开始也没看懂,看到代码后也觉得是脱裤子放屁——多此一举。现在我也觉得是这样。
我来用自己的思考来讲一讲命令模式:
1.既然是命令那么,自然有命令类(Command)
2.使用命令的人需要知道有什么命令
3.命令需要被处理(Receiver)
4.既然命令需要被处理,那么命令类就需要建立命令与处理类之间的关系
5.提供一个统一的命令调用方法
以上逻辑关系理解后,我们根据逻辑进行代码:
1.命令类
interface Command{
excute();
}
2.处理类(先有处理方法,然后才能按处理调用):
class Receiver1{
handle(){
//处理代码
}
}
class Receiver2{
handle(){
//处理代码
}
}
3.具体命令类:
class ConcreteCommand implements {
excute(Receiver1 receiver1){
receiver1.handle();
}
excute(Receiver2 receiver2){
receiver2.handle();
}
}
4.调用类:
class Invoker{
Command command
//设置有哪些命令(可以自己内置)
setCommand(Command command){
this.command = command;
}
//执行命令 Receiver1可以抽象出一个 Receiver类
excuteCommand(Receiver1 receiver1 ){
command.excute(receiver1 );
}
}
5.使用者:
Invoker invoker = new Invoker();
ConcreteCommand concreteCommand = new ConcreteCommand();
invoker.setCommand(concreteCommand );
invoker.excuteCommand(new Receiver1());
以上就是代码了,看不懂吧?我也有点蒙蔽,其实命令模式完全可以这样写:
//处理类,进行具体的逻辑处理
receiver1 = function(a,b){
return a + b
}
receiver2 = function(a,b){
return a - b
}
receiver3 = function(a,b){
return a * b
}
//命令类,定义命令与其处理函数
Command = {
"add": function (obj) {
return receiver1(obj.a,obj.b);
},
"minus": function (obj) {
return receiver2(obj.a,obj.b);
},
"multi": function (obj) {
return receiver3(obj.a,obj.b);
}
}
//调用命令类,提供调用命令统一入口
Invoker = function(command,obj){
Command[command](obj);
}
//调用
Invoker("add",Obj1);
Invoker("minus",Obj2);
以上就好理解了。