1、Commad模式是一种对象行为模式,它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)。("发送者" 是请求操作的对象,"接收者" 是接收请求并执行某操作的对象。有了 "解耦",发送者对接收者的接口一无所知。)这里,"请求"(request)这个术语指的是要被执行的命令。Command模式还让我们可以对 "何时" 以及 "如何" 完成请求进行改变。因此,Command模式为我们提供了灵活性和可扩展性。
2、命令模式的类图
从类图可以看出,命令模式是把发送者和接收者完全解耦。而实际的执行者是receiver。
3、看一下典型代码的实现,客户向服务员要求点菜,服务员将命令发送给厨师,厨师进行做菜。
package com.cvicse.receiver;
/**
* 接收命令做事情者
* @author Administrator
*
*/
public class Kitchener {
/**
* 执行的动作1
*/
public void cookBeef(){
System.out.println("做牛肉");
}
/**
* 执行动作2
*/
public void cookChicken(){
System.out.println("做鸡肉");
}
}
package com.cvicse.command;
import com.cvicse.receiver.Kitchener;
public abstract class Command {
protected Kitchener kitchener=new Kitchener();
/**
* 执行操作方法
*/
public abstract void execute();
}
具体命令1
package com.cvicse.command;
/**
* 做牛肉的具体命令
* @author Administrator
*
*/
public class CookBeefCommand extends Command {
@Override
public void execute() {
super.kitchener.cookBeef();
}
}
具体命令2
package com.cvicse.command;
/**
* 做鸡肉的命令
* @author Administrator
*
*/
public class CookChilkenCommand extends Command {
@Override
public void execute() {
super.kitchener.cookChicken();
}
}
package com.cvicse.invoke;
import com.cvicse.command.Command;
public class Waiter {
private Command comand=null;//引入命令对象
/**
* 设置命令窗口
* @param comand
*/
public void setComand(Command comand){
this.comand=comand;
}
/**
* 执行命令
*/
public void action(){
this.comand.execute();
}
}
客户端调用代码
package com.cvicse.client;
import com.cvicse.command.Command;
import com.cvicse.command.CookBeefCommand;
import com.cvicse.invoke.Waiter;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Waiter waiter=new Waiter();
Command comand=new CookBeefCommand();
waiter.setComand(comand);
waiter.action();
}
}
4、总结该模式,感觉有点像夫妻两个人吵架后,儿子当传话筒相似。老婆下命令,儿子传达命令,自己去执行命令。