命令模式(Command)是一种对象行为模式,它是把一个请求封装到一个对象中,使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式是对命令的封装,它把发出命令的责任与执行命令的责任分开,分别委派给不同的对象。如下图是命令模式的结构图:
这里的参与者都有:
Command
— 声明执行操作的接口。
• ConcreteCommand
— 将一个接收者对象绑定于一个动作。
— 调用接收者相应的操作,以实现 Execute。
•Client
— 创建一个具体命令对象并设定它的接收者。
• Invoker
— 要求该命令执行这个请求。
•Receiver
— 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
由结构图给出对应的类设计,代码如下:
1 class Invoker{//要求命令执行请求 2 private Command command; 3 public Invoker(Command c){ 4 command=c; 5 } 6 public void action(){ 7 System.out.println("execute command action"); 8 command.execute(); 9 } 10 } 11 class Receiver{//实施执行与请求相关的操作 12 public void action(){ 13 System.out.println("this is Receiver's action,I will complete service"); 14 } 15 } 16 interface Command{ 17 void execute(); 18 } 19 class ConcreteCommand implements Command{//将一个接收者对象绑定一个动作,并调用接收者相应的操作,以实现execute 20 private Receiver rec; 21 public ConcreteCommand(Receiver rec){ 22 this.rec=rec; 23 } 24 public void execute(){ 25 System.out.println("Call Receiver's action"); 26 rec.action(); 27 } 28 } 29 public class Test{ 30 public static void main(String[] args) { 31 Receiver rec=new Receiver(); 32 Command com=new ConcreteCommand(rec); 33 Invoker inv=new Invoker(com); 34 inv.action(); 35 } 36 }
这里,我们定义好命令的接收者对象Receiver,然后将其传递给命令对象com,最后由inv要求该命令执行这个请求。从这里可以看出,命令模式将发出命令与执行命令这两个动作分开了,Command发出命令,但催动该命令的执行是Invoker完成的。所以,如果有排队需求的话,可以在Invoker这里设置相关功能。