將一個請求封裝到一個對象,從而使得可用不一樣的請求對客戶進行參數化。數據庫
(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)…………