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、总结该模式,感觉有点像夫妻两个人吵架后,儿子当传话筒相似。老婆下命令,儿子传达命令,自己去执行命令。