熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

java設計模式之Command(菜單命令)

2013-11-23 19:49:03  來源: Java高級技術 

  Command模式是最讓我疑惑的一個模式我在閱讀了很多代碼後才感覺隱約掌握其大概原理我認為理解設計模式最主要是掌握起原理構造這樣才對自己實際編程有指導作用Command模式實際上不是個很具體規定很多的模式正是這個靈活性讓人有些confuse
  
  Command定義
  不少Command模式的代碼都是針對圖形界面的它實際就是菜單命令我們在一個下拉菜單選擇一個命令時然後會執行一些動作
  
  將這些命令封裝成在一個類中然後用戶(調用者)再對這個類進行操作這就是Command模式換句話說本來用戶(調用者)是直接調用這些命令的如菜單上打開文檔(調用者)就直接指向打開文檔的代碼使用Command模式就是在這兩者之間增加一個中間者將這種直接關系拗斷同時兩者之間都隔離基本沒有關系了
  
  顯然這樣做的好處是符合封裝的特性降低耦合度Command是將對行為進行封裝的典型模式Factory是將創建進行封裝的模式
  從Command模式我也發現設計模式一個通病:好象喜歡將簡單的問題復雜化 喜歡在不同類中增加第三者當然這樣做有利於代碼的健壯性 可維護性 還有復用性
  
  如何使用?
  具體的Command模式代碼各式各樣因為如何封裝命令不同系統有不同的做法下面事例是將命令封裝在一個Collection的List中任何對象一旦加入List中實際上裝入了一個封閉的黑盒中對象的特性消失了只有取出時才有可能模糊的分辨出:
  
  典型的Command模式需要有一個接口接口中有一個統一的方法這就是將命令/請求封裝為對象:
  public interface Command {
    public abstract void execute ( );
  } 
  
  具體不同命令/請求代碼是實現接口Command下面有三個具體命令
  public class Engineer implements Command {
  
    public void execute( ) {
      //do Engineers command
    }
  }
  public class Programmer implements Command {
  
    public void execute( ) {
      //do programmers command
    }
  }
  
  public class Politician implements Command {
  
    public void execute( ) {
      //do Politicians command
    }
  }
  
  按照通常做法我們就可以直接調用這三個Command但是使用Command模式我們要將他們封裝起來扔到黑盒子List裡去:
  
  public class producer{
    public static List produceRequests() {
      List queue = new ArrayList();
      queueadd( new DomesticEngineer() );
      queueadd( new Politician() );
      queueadd( new Programmer() );
      return queue;
    }
  
  }
  
  這三個命令進入List中後已經失去了其外表特征以後再取出也可能無法分辨出誰是Engineer 誰是Programmer了看下面如何調用Command模式:
  
  [code]public class TestCommand {
    public static void main(String[] args) {
      
      List queue = ProducerproduceRequests();
      for (Iterator it = erator(); ithasNext(); )
          //取出List中東東其他特征都不能確定只能保證一個特征是%正確
          // 他們至少是接口Command的兒子所以強制轉換類型為接口Command
  
          ((Command)itnext())execute();
    
    }
  } [/code]
  
  由此可見調用者基本只和接口打交道不合具體實現交互這也體現了一個原則面向接口編程這樣以後增加第四個具體命令時就不必修改調用者TestCommand中的代碼了
  
  理解了上面的代碼的核心原理在使用中就應該各人有自己方法了特別是在如何分離調用者和具體命令上有很多實現方法上面的代碼是使用從List過一遍的做法這種做法只是為了演示
  
  使用Command模式的一個好理由還因為它能實現Undo功能每個具體命令都可以記住它剛剛執行的動作並且在需要時恢復
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27499.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.