命令模式(Command)

1、命令模式介紹html

命令模式:將一個請求封裝爲一個對象,從而使你可用不一樣的請求對客戶進行參數化,對請求排隊或記錄請求日誌。以及支持可撤銷的操做。java

說白了,就是將一系列的請求命令封裝起來,不直接調用真正執行者的方法,這樣比較好擴展。數據庫

命令模式UML圖:設計模式

Command(抽象命令類):抽象出命令對象,能夠根據不一樣的命令類型。寫出不一樣的實現類ide

ConcreteCommand(具體命令類):實現了抽象命令對象的具體實現學習

Invoker(調用者/請求者)請求的發送者,它經過命令對象來執行請求。一個調用者並不須要在設計時肯定其接收者,所以它只與抽象命令來之間測試

存在關聯。在程序運行時,將調用命令對象的execute() ,間接調用接收者的相關操做。this

Receiver(接收者):接收者執行與請求相關的操做,真正執行命令的對象。具體實現對請求的業務處理。未抽象前,實際執行操做內容的對象。spa

Client(客戶端):在客戶類中須要建立調用者對象,具體命令類對象,在建立具體命令對象時指定對應的接收者。發送者和接收者之間沒有之間關係。設計

都經過命令對象來調用。

 

2、命令模式代碼實現

首先定義一個命令的接收者,也就是到最後真正執行命令的那我的

1
2
3
4
5
6
//接收者:真正執行命令的對象
public class Receiver {
     public void action(){
         System.out.println( "命令執行了......." );
     }
}

而後定義抽象命令和抽象命令的具體實現,具體命令類中須要持有真正執行命令的那個對象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//抽象命令類:抽象的命令,能夠根據不一樣類型的命令寫出不一樣的實現
public interface Command {
     //調用命令
     void execute();
}
//具體命令類
class ConcreteCommand implements Command{
     private Receiver receiver; //持有真正執行命令對象的引用
     public ConcreteCommand(Receiver receiver) {
         super ();
         this .receiver = receiver;
     }
     @Override
     public void execute() {
         //調用接收者執行命令的方法
         receiver.action();
     }
}

接下來就能夠定義命令的發起者了,發起者須要持有一個命令對象。以便來發起命令。

1
2
3
4
5
6
7
8
9
10
11
12
//請求者/調用者:發起執行命令請求的對象
public class Invoker {
     private Command command; //持有命令對象的引用
     public Invoker(Command command) {
         super ();
         this .command = command;
     }
     public void call(){
         //請求者調用命令對象執行命令的那個execute方法
         command.execute();
     }
}

客戶端測試:客戶端

1
2
3
4
5
6
public static void main(String[] args) {
     //經過請求者(invoker)調用命令對象(command),命令對象中調用了命令具體執行者(Receiver)
     Command command = new ConcreteCommand( new Receiver());
     Invoker invoker = new Invoker(command);
     invoker.call();
}

結果打印:命令執行了.......

代碼的UML圖以下:

 

3、應用場景

Struts2中action中的調用過程當中存在命令模式

數據庫中的事務機制的底層實現

命令的撤銷和恢復:增長相應的撤銷和恢復命令的方法(好比數據庫中的事務回滾)

 

 

 



Java23種設計模式學習筆記【目錄總貼】

參考資料:

  大話設計模式(帶目錄完整版).pdf

  HEAD_FIRST設計模式(中文版).pdf

  尚學堂_高淇_java300集最全視頻教程_【GOF23設計模式】

相關文章
相關標籤/搜索