将一个请求封装到一个对象,从而使得可用不一样的请求对客户进行参数化。数据库
(1)Command 抽象命令类ide
(2)ConcreteCommand 具体命令类测试
(3)Invoker 调用者 / 请求者this
请求的发送者,他经过命令对象来执行。一个调用者并不须要在设计时肯定其接受者,所以它只与抽象命令类之间存在关联,在程序运行时,将调用命令对象的execute(),间接调用接受者的相关操做。spa
(4)Receiver 接收者设计
接收者执行与请求相关的操做,具体实现对请求的业务处理。code
未抽象前,实际执行操做内容的对象。对象
(5)Client 客户类blog
在客户类中须要建立调用者对象、具体命令类对象,在建立具体命令类对象时指定对应的接受者。发送者和接收者之间没有直接关系,都经过命令对象间接调用。接口
场景:在军队中,团长发出做战命令,但不指定谁去执行命令,命令根据接受者的不一样去让接受者(战士)去执行命令。
1 /** 2 * 命令接口 3 * @author CL 4 * 5 */ 6 public interface Command { 7 /** 8 * 在真正的项目中能够设计多个方法 9 */ 10 void execute(); 11 } 12 13 /** 14 * 真正的命令 15 * @author CL 16 * 17 */ 18 class ConcreteCommand implements Command { 19 /** 20 * 命令真正的执行者 21 */ 22 private Receiver receiver; 23 24 public ConcreteCommand() { 25 } 26 27 public ConcreteCommand(Receiver receiver) { 28 this.receiver = receiver; 29 } 30 31 @Override 32 public void execute() { 33 //命令执行前或后,进行相关的操做 34 receiver.action(); 35 } 36 37 }
1 /** 2 * 命令的调用者或发起者(至关于例子中的团长) 3 * @author CL 4 * 5 */ 6 public class Invoke { 7 8 private Command command; //也能够经过容器List<Command>容纳不少的命令,进行批处理。 9 //数据库底层的事务管理就是相似的结构! 10 11 public Invoke(Command command) { 12 this.command = command; 13 } 14 15 /** 16 * 下达命令 17 */ 18 public void call() { 19 //命令执行前或后,进行相关的操做 20 //经过命令对象间接调用接收者 21 command.execute(); 22 } 23 24 }
1 /** 2 * 真正的命令执行者(至关于例子中的战士) 3 * @author CL 4 * 5 */ 6 public class Receiver { 7 8 /** 9 * 执行命令 10 */ 11 public void action() { 12 System.out.println("战士去执行做战命令!"); 13 } 14 15 }
测试:
1 /** 2 * 测试命令模式 3 * @author CL 4 * 5 */ 6 public class Client { 7 8 public static void main(String[] args) { 9 //建立具体命令类对象并指定对应的接受者 10 Command command = new ConcreteCommand(new Receiver()); 11 12 Invoke invoke = new Invoke(command); 13 14 invoke.call(); 15 } 16 }
控制台输出:
战士去执行做战命令!
(1)Struts2 中,action 的整个调用过程就是命令模式;
(2)数据库事务机制的底层实现;
(3)命令的撤销和恢复;
(4)…………