執行方案(Command) (轉)

worldblog發表於2008-01-31
執行方案(Command) (轉)[@more@]

 

這個.可能是變化比較多的一個模式.也是最沒有定型的一個模式.因為

相對比較靈活.常見的是對GUI圖形介面的命令封裝這樣即使更改介面元素只

要功能不變那麼也不影響效果.就如同以前程式導向的環境那要.吧

功能封裝到多個過程.進行.但是Command模式.又一個優點就是可以還原

把以前做過的工作還原到未做工作之前.這個也就是事務性.這就必須要一個

事務列表來維護.事務回滾.當然如果只是單任務那麼只需要一個狀態就可以

判斷是否執行.下面在引出幾個職能.一個是呼叫者.他負責實際的呼叫命令

一個是接收者.他負責告表示命令執行的效果.那麼最後的就是命令本身.

也就是實際工作.他們之間的關係是.客戶透過呼叫者呼叫命令.命令執行完畢

返回執行情況.同時命令具備事務性.如果執行情況沒有成功要還原到原點.

客戶透過執行情況判斷具體狀態.

那麼下面我還是假設一種具體情況.我並打算用圖形介面因為.那麼沒有通用

性.而且Command模式也不一定要用到圖形介面中.假設客戶要申請一個號碼可

是號碼不能是3或3的倍數.下面我們來模擬具體情況.

//構造命令
interface ICommand{
  bool state{get; set;}//記錄事務狀態
  int  Execute();
  void UnExecute();//保證事務回滾
}

public class NumCommand : ICommand{
  private bool State=false;//事務狀態
 
  public bool state{
  get{return State;}
  set{State=value;}
  }
 
  public  int  Execute( ){
  int revalue;
  state=true;//表示已執行
  this.r=fr;//指定一個命令接收者
  Ran rd=new Randmo();
  revalue=(int)(rd.NextDouble()*100);
  this.r.Show(revalue);//呈現具體
  return revalue;
  }
 
  public void UnExecute(){
  state=false;//狀態回滾
  }
}


//構造接收者
interface IReceiver{}
public class  Receiver:IReceiver{
  public void Show(int Number){
  Console.WriteLine("您申請的序號為:"+Number);
  }
}

//呼叫者(呼叫者維護事務),這裡的呼叫者相當實際客戶的.

public class Invoker{
  private ICommand command;
  private IReceiver receiver;//由接收者負責具體的表示

  //裝入實際命令
  public void InstallCommand(ICommand c){
  this.command=c;
  }
 
  //呼叫實際功能
  public InvokerExecute(IReceiver r){
  Rollback:
  int Number=this.command.Execute();
  if(Number%3)//是3的倍數{
  this.command.UnExecute();
  goto Rollback;//事務回滾 
  }
  else{
  r.Show(Number);
  }
  }
}

//客戶呼叫
public class Client {
  public static int Main(string[] args){
  ICommand  command=new NumCommand();
  IReceiver  r=new Receiver();
  Invoker  i=new Invoker();
 
  i.InstallCommand(c);//裝入命令
  i.InvokerExecute(r);//表示執行 
  return 0;
  }
}


實際上.客戶可以裝入任意的命令.客戶的表示也是可以是任意的.也就是說

呼叫者只負責.事務的維護和把命令對應到具體的接收者上去.如果是介面

中的Command模式.那麼呼叫者就是對指標的封裝.或是事件代理或事件

者.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998936/,如需轉載,請註明出處,否則將追究法律責任。

相關文章