Design Pattern學習筆記 --- Command(命令)模式

Command(命令)模式屬於對象行爲型模式;java

Command命令模式經過將請求自己封裝成一個對象,以期向未知的對象提出請求.而且這個對象可被存儲並像其它的對象同樣被傳遞.設計模式

實現Command模式的關鍵在於抽象出一個Command類;這個類定義了一個可執行操做的接口(抽象方法).具體的Command子類依賴一個接收都類的實例變量,在具體的Command子類實現抽象方法時調用接收者的動做以完成相應的操做.框架

㈠意圖:ide

    將一個請求封裝成對象,從而使你可用不一樣的請求對客戶進行參數化;對請求排除或者記錄請求日誌;以及支持可撤銷的操做;this

    -- GOF設計模式spa

   功力暫時不夠,不是很懂這句話的意思.設計

㈡理解:日誌

   必須向某對象提交請求;可是並不知道關於被請求的操做或請求的執行都的任何信息; 對象

   好比:咱們在界面上提供一個按鈕或者菜單;咱們只是規定了要想使按鈕(菜單)執行某些動做,必須調用它的Click方法;這時咱們就能夠考慮用Command模式;和接口回調有點類似;都是將具體的執行交由客戶來完成;接口

㈢UML圖:

 

㈣場景描述:

  考慮一個計算器模型的設計:

  計算器的大體框架咱們做爲廠商能夠提供出來;一排排的按鈕和點擊這些按鈕能夠觸發一些操做;(做爲計算器模型的硬件提供商) Command(抽象類)

  計算器的軟件提供商則會對計算器的具體按鈕進行封裝; 具體Command類

  每個不一樣類型的Command類會執行相應的動做;進行加,減,乘,除的操做;(調用真正地處理方法)

  而傳入的數據則對應每一個具體的接收者.(加1, 加2, 加3, 加4)

  沒有按"="號以前就至關於維護在一個Invoker,去不斷地接收命令.

(五)代碼實現:

  
  
  
  
  1. /** 
  2.  * Command模式中的command抽象類 
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public abstract class Command { 
  11.     protected abstract void command(); 
  
  
  
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class AddCommand extends Command { 
  11.  
  12.     private AddReceiver addReceiver; 
  13.     public AddCommand(AddReceiver addReceiver) 
  14.     { 
  15.         this.addReceiver = addReceiver; 
  16.     } 
  17.      
  18.     @Override 
  19.     protected void command() { 
  20.         addReceiver.add(); 
  21.     } 
  22.  
  
  
  
  
  1. /** 
  2.  * Command模式中的Receiver操做;知道如何實施和執行一個相關的操做;任何類均可能做爲一個接收者 
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class AddReceiver { 
  11.      
  12.     public void add() 
  13.     { 
  14.         System.out.println(" 加上一 "); 
  15.     } 
  16.      
  17.  

 

  
  
  
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  *  
  8.  * @author hubert 
  9.  * 
  10.  */ 
  11. public class SubtractionCommand extends Command{ 
  12.  
  13.     private SubtractionReceiver subtractionReceiver; 
  14.      
  15.     public SubtractionCommand(SubtractionReceiver subtractionReceiver) 
  16.     { 
  17.         this.subtractionReceiver = subtractionReceiver; 
  18.     } 
  19.      
  20.     @Override 
  21.     protected void command() { 
  22.         // TODO Auto-generated method stub 
  23.         subtractionReceiver.subtract(); 
  24.     } 
  25.  

 

  
  
  
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. import java.util.ArrayList; 
  7. import java.util.List; 
  8.  
  9. /** 
  10.  * @author hubert 
  11.  * 
  12.  */ 
  13. public class Invoker { 
  14.      
  15.     private List<Command> commandSeq = new ArrayList<Command>(); 
  16.      
  17.     public List<Command> getCommandSeq() { 
  18.         return commandSeq; 
  19.     } 
  20.  
  21.     public void setCommandSeq(List<Command> commandSeq) { 
  22.         this.commandSeq = commandSeq; 
  23.     } 
  24.  
  25.     public List<Command> addCommand(Command command) 
  26.     { 
  27.         commandSeq.add(command); 
  28.         return commandSeq; 
  29.     } 
  30.      
  31.     public List<Command> removeCommand(Command command) 
  32.     { 
  33.         if(this.commandSeq != null && this.commandSeq.contains(command)) 
  34.         { 
  35.             commandSeq.remove(command); 
  36.         } 
  37.          
  38.         return commandSeq; 
  39.     } 
  40.      
  
  
  
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class SubtractionReceiver { 
  11.     public void subtract() 
  12.     { 
  13.         System.out.println(" 減小一 "); 
  14.     } 

 

  
  
  
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.command; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class Client { 
  11.  
  12.     /** 
  13.      * @param args 
  14.      */ 
  15.     public static void main(String[] args) { 
  16.          
  17.         AddReceiver addReceiver = new AddReceiver(); 
  18.         Command addCommand = new AddCommand(addReceiver); 
  19.          
  20.          
  21.         SubtractionReceiver subtractionReceiver = new SubtractionReceiver(); 
  22.         Command subCommand = new SubtractionCommand(subtractionReceiver); 
  23.          
  24.         Invoker invoker = new Invoker(); 
  25.         invoker.addCommand(addCommand).add(subCommand); 
  26.          
  27.         for(Command command : invoker.getCommandSeq()) 
  28.         { 
  29.             command.command(); 
  30.         } 
  31.  
  32.     } 
  33.  
相關文章
相關標籤/搜索