Java設計模式-命令模式Command

定義

將來自客戶端的請求傳入一個對象,從而使你可用不同的請求對客戶進行參數化。用於“行爲請求者”與“行爲實現者”解耦,可實現二者之間的鬆耦合,以便適應變化。分離變化與不變的因素。

UML圖:

角色
Command:定義命令的接口,聲明執行的方法。
ConcreteCommand:命令接口實現對象,是“虛”的實現;通常會持有接收者,並調用接收者的功能來完成命令要執行的操作。
Receiver:接收者,真正執行命令的對象。任何類都可能成爲一個接收者,只要它能夠實現命令要求實現的相應功能。
Invoker:要求命令對象執行請求,通常會持有命令對象,可以持有很多的命令對象。這個是客戶端真正觸發命令並要求命令執行相應操作的地方,也就是說相當於使用命令對象的入口。
Client:創建具體的命令對象,並且設置命令對象的接收者。注意這個不是我們常規意義上的客戶端,而是在組裝命令對象和接收者,或許,把這個Client稱爲裝配者會更好理解,因爲真正使用命令的客戶端是從Invoker來觸發執行。

總的調用順序是:

請求者持有命令對象,調用命令對象的方法,命令對象持有接受者,進而調用接受者的執行方法。

適用情況
1.系統需要將請求調用者和請求接收者解耦,使得調用者和接收者不直接交互。
2.系統需要在不同的時間指定請求、將請求排隊和執行請求。
3.系統需要支持命令的撤銷(Undo)操作和恢復(Redo)操作。
4.系統需要將一組操作組合在一起,即支持宏命令。


簡單命令模式

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. package com.hust.command1;  

  2. //接收者類  

  3. public class Receiver {  

  4.     //真正執行命令邏輯的方法  

  5.    public  void action(){  

  6.        System.out.println("執行具體操作!");  

  7.    }  

  8. }  

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. /** 

  2.  *  

  3.  */  

  4. package com.hust.command1;  

  5.   

  6. /** 

  7.  * 抽象命令接口 

  8.  * 

  9.  */  

  10. public interface Command {  

  11.     //執行具體操作的命令  

  12.     void execute();  

  13. }  


[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. package com.hust.command1;  

  2. //具體命令類  

  3. public class ConcreteCommand implements Command {  

  4.     private  Receiver  receiver;//接收者作爲成員變量  

  5.     public ConcreteCommand(Receiver  receiver){  

  6.         this.receiver=receiver;  

  7.     }  

  8.     //調用接收者的相關方法來執行具體邏輯  

  9.     public void execute() {       

  10.         receiver.action();  

  11.     }  

  12.   

  13. }  

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. /** 

  2.  *  

  3.  */  

  4. package com.hust.command1;  

  5.   

  6. /** 

  7.  * 請求者類 

  8.  * 

  9.  */  

  10. public class Invoker {  

  11.     private Command command;//命令對象做成員變量  

  12.       

  13.     public Invoker(Command command){  

  14.         this.command=command;  

  15.     }  

  16.       

  17.     public void action(){  

  18.         //調用命令對象的相關方法,執行具體命令  

  19.         command.execute();  

  20.     }  

  21. }  


[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. package com.hust.command1;  

  2.   

  3. public class Client {  

  4.   

  5.     /** 

  6.      * @param args 

  7.      */  

  8.     public static void main(String[] args) {  

  9.         //構造一個接收者對象  

  10.         Receiver receiver=new Receiver();  

  11.         //構造一個命令對象  

  12.         Command command=new ConcreteCommand(receiver);  

  13.         //構造一個請求者對象,去請求命令對象,命令對象在去執行操作  

  14.         Invoker invoker=new Invoker(command);  

  15.         invoker.action();  

  16.   

  17.     }  

  18.   

  19. }  


俄羅斯方塊遊戲,有4個按鈕,兩個左右移動按鈕,一個快速下落按鈕,一個變形按鈕


一個玩遊戲的人是相當於客戶端,而遊戲上的4個按鈕就相當於請求者,執行具體按鈕命令的邏輯方法可以看作是命令角色。

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. /** 

  2.  *  

  3.  */  

  4. package com.hust.shutdown;  

  5.   

  6. /** 

  7.  * @author Administrator 

  8.  * 

  9.  */  

  10. public class TetrisMachine {//俄羅斯方塊  

  11.     //真正處理“向左”操作的邏輯代碼  

  12.     public void toLeft(){  

  13.         System.out.println("向左");  

  14.     }  

  15.     //真正處理“向右”操作的邏輯代碼  

  16.     public void toRight(){  

  17.         System.out.println("向右");  

  18.     }  

  19.     //真正處理“快速落下”操作的邏輯代碼  

  20.     public void fastToButtom(){  

  21.          System.out.println("快速落下");  

  22.     }  

  23.    //真正處理“改變形狀”操作的邏輯代碼  

  24.     public void transform(){  

  25.      System.out.println("改變形狀");  

  26.    }  

  27. }  

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. /** 

  2.  *  

  3.  */  

  4. package com.hust.shutdown;  

  5.   

  6. /** 

  7.  * 抽象命令接口 

  8.  * 

  9.  */  

  10. public interface Command {  

  11.     //執行具體操作的命令  

  12.     void execute();  

  13. }  

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. package com.hust.shutdown;  

  2.   

  3. public class LeftCommand implements Command {  

  4.     //接收者俄羅斯方塊  

  5.     private TetrisMachine machine;  

  6.       

  7.       

  8.     public LeftCommand(TetrisMachine machine) {  

  9.         super();  

  10.         this.machine = machine;  

  11.     }  

  12.     public void execute() {  

  13.         // 調用遊戲機的具體方法執行操作  

  14.         machine.toLeft();  

  15.     }  

  16.   

  17. }  


[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. package com.hust.shutdown;  

  2.   

  3. public class RightCommand implements Command {  

  4.     //接收者俄羅斯方塊  

  5.     private TetrisMachine machine;  

  6.       

  7.       

  8.     public RightCommand(TetrisMachine machine) {  

  9.         super();  

  10.         this.machine = machine;  

  11.     }  

  12.     public void execute() {  

  13.         // 調用遊戲機的具體方法執行操作  

  14.         machine.toRight();  

  15.     }  

  16. }  


[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. package com.hust.shutdown;  

  2.   

  3. public class FallCommand implements Command {  

  4.     //接收者俄羅斯方塊  

  5.     private TetrisMachine machine;  

  6.       

  7.       

  8.     public FallCommand(TetrisMachine machine) {  

  9.         super();  

  10.         this.machine = machine;  

  11.     }  

  12.     public void execute() {  

  13.         // 調用遊戲機的具體方法執行操作  

  14.         machine.fastToButtom();  

  15.     }  

  16.   

  17. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章