1. 程式人生 > >設計模式之命令(Command)模式

設計模式之命令(Command)模式

     Command定義如下: 將來自客戶端的請求傳入一個物件,無需瞭解這個請求啟用的動作或有關接受這個請求的處理細節。

是不是有點迷糊。不知其說的是啥。哈哈。彆著急下面聽我慢慢到來。

本人覺得,命令模式就是把一些具體的命令封裝成一此具體的類,這此類實現同一個介面或者是抽象類。然後把這些類組織到起,然後統一來執行,完成一個具體的業務流程。

它的優點是:解藉了傳送者與接收者之間的聯絡。傳送者呼叫一個操作,接收者接受請求執行相應的動作,說白了就是呼叫一個具體的類來執行相應的方法。因為使用Command模式解耦,傳送者無需知道接受者任何介面。

比如說,對檔案進行操作,如開啟、關閉、列印。正常的操作就是使用者點選“開啟”按紐,就執行開啟命令,在按紐的單擊事件中寫個方法就可以了。但如要應用Command模式,就要把其抽象出介面,把這三個操作封裝成單獨的類。也許有人要問,為什麼要把簡單的問題複雜化呢?。雖然在程式碼量上有所增加,這樣做有利於程式碼的健壯性 可維護性 還有複用性。這是前人總結出來的經驗。

說了半天,如何使用呢,別說費話了,“必需的”。

具體的Command模式程式碼各式各樣,因為如何封裝命令,不同系統,有不同的做法。

典型的Command模式需要有一個介面.介面中有一個統一的方法,這就是"將命令/請求封裝為物件。

public interface Command {
  public abstract void execute ( );
} 

具體不同命令/請求程式碼是實現介面Command,下面有三個具體命令(開啟命令、關閉命令、列印命令)

public class Open implements Command {

  public void execute( ) {
          System.out.println("開啟");
  }
} 
public class Close implements Command {

  public void execute( ) {
          System.out.println("關閉");
  }
}

public class Print implements Command {

  public void execute( ) {
          System.out.println("列印");
  }
}

按照通常做法,我們就可以直接呼叫這三個Command,但是使用Command模式,我們要將他們封裝起來,扔到黑盒子List裡去:

public class producer{
  public static List produceRequests() {
    List queue = new ArrayList();
    queue.add( new Open() );
    queue.add( new Close() );
    queue.add( new Print() );
    return queue; 
  }

}


這三個命令進入List中後,已經失去了其外表特徵,以後再取出,也可能無法分辨出誰是Open誰是Close了,看下面客戶端如何呼叫Command模式:

public class TestCommand {
  public static void main(String[] args) {
    
    List queue = Producer.produceRequests();
    for (Iterator it = queue.iterator(); it.hasNext(); )
      
 //客戶端直接呼叫execute方法,無需知道被呼叫者的其它更多類的方法名。
        ((Command)it.next()).execute();
  

  }
} 

由此可見,呼叫者基本只和介面打交道,不合具體實現互動,這也體現了一個原則,面向介面程式設計,這樣,以後增加第四個具體命令時,就不必修改呼叫者TestCommand中的程式碼了.

理解了上面的程式碼的核心原理,在使用中,就應該各人有自己方法了,特別是在如何分離呼叫者和具體命令上,有很多實現方法,上面的程式碼是使用"從List過一遍"的做法.這種做法只是為了演示.