命令模式介紹

命令模式最初的感受是把邏輯實作與操作請求進行分離,降低耦合方便擴展,
命令模式是一種行為模式,以資料驅動的方式將命令物件,通過建構式的形式傳遞給呼叫者,呼叫者再提供相應的實作為命令執行提供操作方法,
命令場景的核心的邏輯是呼叫方不需要去關心具體的邏輯實作,它只管呼叫它需要的模塊,而被呼叫方也不需要關心被誰呼叫,它只負責完成模塊的實作就行,
命令模式的使用場景需要分為三個比較大的塊:命令、實作、呼叫者,而這三塊內容的拆分也是選擇適合場景的關鍵因素,經過這樣的拆分可以讓邏輯具備單一職責的性質,便于擴展,
命令模式可將請求轉換為一個包含與請求相關的所有資訊的獨立物件,該轉換讓你能根據不同的請求將方法引數化、延遲請求執行或將其放入佇列中且能實作可撤銷操作,
優秀的軟體設計通常會將關注點進行分離,而這往往會導致軟體的分層,
命令模式的結構
-
發送者
也可叫觸發者,負責對請求進行初始化,其中必須包含一個成員變數來存盤對于命令物件的參考,發送者觸發命令,而不向接收者直接發送請求,
-
命令
通常僅宣告一個執行命令的方法
-
具體命令
實作各種型別的請求,具體命令自身并不完成作業,而是會將委派給一個業務邏輯物件,
-
接收者
包含部分業務邏輯,幾乎任何物件都可以作為接收者,絕大部分命令只處理如何將請求傳遞到接收者的細節,接收者自己會完成實際的作業,
-
客戶端
創建并配置具體命令物件,客戶端必須將包括接收者物體在內的所有請求傳遞給命令的建構式,
適用場景
- 通過操作來引數化物件
- 想將操作放入佇列中、操作的執行或者遠程執行操作
- 實作操作回滾功能
命令模式的實作方式
1、宣告僅有一個執行方法的命令介面,
2、抽取請求并使之成為實作命令介面的具體命令類,每個類都必須有一組成員變數來保存請求引數和對于實際接收者物件的參考,
3、找到擔任發送者職責的類,在這些類中添加保存命令的成員變數,發送者只能通過命令介面與其命令進行互動,發送者自身通常并不創建命令物件,而是通過客戶端代碼獲取,
4、修改發送者使其執行命令,而非直接將請求發送給接收者,
5、客戶端必須按照以下順序來初始化物件,
- 創建接收者
- 創建命令
- 創建發送者并將其與特定命令關聯
Demo
命令模式可以通過抽象或介面型別(發送者)中的行為方法來識別,該型別呼叫另一個不同的抽象或介面型別(接收者)實作中的方法,該實作則是在創建時由命令模式的實作封裝,
介面與實作類
/// <summary>
/// 簡單命令 實作命令介面
/// </summary>
class SimpleCommand : ICommand
{
private string _info;
public SimpleCommand(string message)
{
this._info = message;
}
public void Execute()
{
Console.WriteLine("執行簡單命令,"+_info);
}
}
/// <summary>
/// 復雜命令 實作命令介面
/// </summary>
class ComplexCommand : ICommand
{
Receiver _receiver;
private string _complexOneInfo;
private string _complexTwoInfo;
public ComplexCommand(Receiver receiver,string oneInfo,string twoInfo)
{
_receiver = receiver;
_complexOneInfo = oneInfo;
_complexTwoInfo = twoInfo;
}
public void Execute()
{
Console.WriteLine("執行復雜命令");
_receiver.DoOne(_complexOneInfo);
_receiver.DoTwo(_complexTwoInfo);
}
}
接收者
/// <summary>
/// 接收者
/// </summary>
class Receiver
{
public void DoOne(string oneInfo)
{
Console.WriteLine("接收的資訊為:"+oneInfo);
}
public void DoTwo(string oneInfo)
{
Console.WriteLine("接收的資訊為:" + oneInfo);
}
}
呼叫者
/// <summary>
/// 呼叫者Invoker
/// </summary>
public class InvokerClient
{
private ICommand _one;
private ICommand _two;
public void SetOnOne(ICommand com)
{
_one = com;
}
public void SetOnTwo(ICommand com)
{
_two = com;
}
public void DoExecute()
{
Console.WriteLine("呼叫者One的列印");
if (_one is ICommand)
{
_one.Execute();
}
Console.WriteLine("呼叫者Two的列印");
if (_two is ICommand)
{
_two.Execute();
}
}
}

此模式在執行一些業務邏輯比較條理化的需求時,可以被使用,通過將業務中的鏈條關系,整合成一個個命令,呼叫者直接呼叫對應的命令介面就行,根本不需要知道是誰,如何提供的方法,而且實作方法的人也不知道誰呼叫的,如何呼叫的,這些對于它們來說都是不相關的,也滿足單一職責和開閉原則,
小寄語
原創不易,給個關注唄,
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的,
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩關注、點贊、轉發 謝謝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294848.html
標籤:設計模式
上一篇:為了讓師妹20分鐘學會canvas,我熬夜苦肝本文外加一個小專案【??建議收藏??】
下一篇:設計模式之命令模式
