GOF23設計模式之命令模式(command)

1、命令模式概述

  將一個請求封裝到一個對象,從而使得可用不一樣的請求對客戶進行參數化。數據庫

2、命令模式結構

  (1)Command 抽象命令類ide

  (2)ConcreteCommand 具體命令類測試

  (3)Invoker 調用者 / 請求者this

      請求的發送者,他經過命令對象來執行。一個調用者並不須要在設計時肯定其接受者,所以它只與抽象命令類之間存在關聯,在程序運行時,將調用命令對象的execute(),間接調用接受者的相關操做。spa

  (4)Receiver 接收者設計

      接收者執行與請求相關的操做,具體實現對請求的業務處理。code

      未抽象前,實際執行操做內容的對象。對象

  (5)Client 客戶類blog

      在客戶類中須要建立調用者對象、具體命令類對象,在建立具體命令類對象時指定對應的接受者。發送者和接收者之間沒有直接關係,都經過命令對象間接調用。接口

3、命令模式場景導入與示例代碼

  場景:在軍隊中,團長發出做戰命令,但不指定誰去執行命令,命令根據接受者的不一樣去讓接受者(戰士)去執行命令。

 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 }

  控制檯輸出:

戰士去執行做戰命令!

4、命令模式場景開發應用場景

  (1)Struts2 中,action 的整個調用過程就是命令模式;

  (2)數據庫事務機制的底層實現;

  (3)命令的撤銷和恢復;

  (4)…………

相關文章
相關標籤/搜索