在.Net框架中很多對象的方法中都會有Invoke方法,這種方法的設計實際是用了設計模式的命令模式, 模式圖如下 其核心思路是將Client 向Receiver發送的命令行為進行抽象(ICommand),實例化(ConcreteCommand),以便對這些行為能夠控制(記錄,取消,恢復); 每個Co ...
在.Net框架中很多對象的方法中都會有Invoke方法,這種方法的設計實際是用了設計模式的命令模式,
模式圖如下
其核心思路是將Client 向Receiver發送的命令行為進行抽象(ICommand),實例化(ConcreteCommand),以便對這些行為能夠控制(記錄,取消,恢復);
每個Command與Client是解耦的,即不依賴具體客戶,調度者Invoker可以負責記錄,控制客戶執行了那些請求,與客戶端存在單一的關聯。
示例:計算器(Calculator)可以執行很多計算操作,客戶(client)向指定的接收者發送指令,命令從客戶到達接收者實際上是間接進行的,是先通過調度者(Invoker)將指定的輸入(state)和指定的命令,傳遞給接收者,接受者再執行具體的任務。代碼如下
//示例:一個計算器,接受用戶的計算請求,計算器提供一些計算方法,要求請求任務中過程可以記錄請求的行為,請求中狀態的變化和請求繼續和取消 public class Client { public Invoker Invoker { get; set; } = new Invoker();
//簡化代碼 public void Invoke(string CommandName,params object[] states) { Invoker.Invoke(CommandName, states); }
//簡化代碼 public void Invoke(string CommandName,out object result,params object[] states) { Invoker.Invoke(CommandName, out result, states); } } public class Invoker { public Dictionary<string, ICommand> Commands { get; set; } = new Dictionary<string, ICommand>(); /// <summary> /// /// </summary> /// <param name="CommandName"></param> /// <param name="returnResult">需要返回結果的命令</param> /// <param name="states"></param> public void Invoke(string CommandName,out object returnResult, params object[] states) { //傳遞參數 Commands[CommandName].State = states; //執行操作 Commands[CommandName].Execute(); returnResult = Commands[CommandName].State; } /// <summary> /// 無需返回結果 /// </summary> /// <param name="CommandName"></param> /// <param name="states"></param> public void Invoke(string CommandName,params object[] states) { //傳遞參數 Commands[CommandName].State = states; //執行操作 Commands[CommandName].Execute(); } //下麵可以寫一些方法用來恢複數據或記錄行為 //可以在Invoke 方法中使用非同步方法放入token來中斷執行,並將State恢復到原來狀態 } public interface ICommand { string CommandName { get; set; } object State { get; set; }//記錄狀態,可以是數據 void Execute(); } //求積運算 public class CalcuteMulCommand : ICommand { public string CommandName { get ; set ; } public object State { get ; set ; } private object receiver; public CalcuteMulCommand(object _receiver) { receiver = _receiver; } public void Execute() { State= ( (Calculator)receiver).Mutiply((int)((object[])State)[0], (int)((object[])State)[1]); } } internal class Calculator { public Calculator() { } public double Mutiply(int a,int b) { return a * b; } }
//測試代碼
class Test
{
static void Main(string[] args)
{
Client client = new Client();
client.Invoker.Commands.Add("CalcuteMulCommand", new CalcuteMulCommand(new Calculator()));
object result;
client.Invoke("CalcuteMulCommand",out result, 5, 2);
Console.WriteLine(result.ToString());
Console.ReadKey();
}
}