通俗易懂設計模式解析——命令模式

前言

  今天咱們一塊兒來看行爲型設計模式中的命令模式、何爲命令模式呢?先談命令——我如今須要對某一條信息進行刪除,我進行點擊刪除按鈕。後臺執行刪除的命令、對信息進行刪除。那麼咱們要講的命令模式又是什麼呢?命令模式就是把一個操做或者行爲抽象爲一個對象。而後經過對命令的抽象化來使得發出命令的職責和執行命令的職責分隔開。簡單來講命令模式就是解決命令的請求者和命令的執行者之間的耦合關係的。html

命令模式介紹

1、來由

  在咱們開發軟件系統的時候,命令的請求者和命令的執行者是屬於緊耦合的狀態。可是對於某些特殊場合這麼一種緊耦合的狀態就不合適了。例如對行爲命令的」日誌記錄、撤銷/恢復、命令的隊列」等操做就不太合適了。那麼在這些狀況下如何對這些命令進行統一的管理呢?實現其鬆耦合呢?設計模式

2、意圖

  將一個請求封裝成一個對象,從而使您能夠用不一樣的請求對客戶進行參數化。ide

3、案例圖

 

4、命令模式代碼示例

咱們看上面的案例圖能夠看到命令模式是包含了如下五個部分的:this

客戶角色:建立具體的命令對象並肯定命令對象的接收者spa

命令請求者:命令模式中最重要的角色、持有命令對象、實現對命令的控制、要求命令對象執行請求設計

命令接收者:真正的命令的執行者、實現具體功能日誌

命令角色:聲明全部的命令的一個抽象類code

具體命令角色:命令接口實現對象、持有命令接收者、調用接收者完成命令的執行htm

在咱們平常軟件開發過程當中一定會涉及到信息的增刪改查、通常的信息進行操做也就罷了。可是對於一些重要的信息進行操做的時候咱們是否就須要對其進行控制了。好比對其操做的日誌的記錄。對操做命令的撤銷恢復。這裏咱們看看如何使用命令模式來對命令進行控制操做:對象

 

namespace Command_Pattern { class CommandPattern { } #region 命令接收者——具體操做 ===================
    /// <summary>
    /// 執行命令 /// </summary>
    public class InfoReceiver { public void Delete() { Console.WriteLine("刪除了第一條信息!"); } public void Update() { Console.WriteLine("更新了次日信息!"); } } #endregion

    #region 命令請求者——控制命令 ===================
    /// <summary>
    /// 控制命令調用請求 /// </summary>
    public class InfoInvoke { /// <summary>
        /// 記錄上一個命令 /// </summary>
        private Command lastCommand =null; /// <summary>
        /// 接收當前命令 /// </summary>
        private Command _command = null; public InfoInvoke(Command command=null) { this._command = command; } public string ExecuteInvoke() { if (_command==null&& lastCommand==null) return ("無命令執行!"); if (_command == null) { Console.WriteLine($"記錄此操做記錄{_command.GetType().Name}的撤銷操做!"); _command = lastCommand; return ("執行撤銷操做!"); } Console.WriteLine($"記錄此操做記錄{_command.GetType().Name}!"); _command.Execute(); return ("執行成功!"); } } #endregion

    #region 命令角色——抽象命令 =====================
    /// <summary>
    /// 抽象命令 持有命令接收者,調用接收者執行命令 /// </summary>
    public abstract class Command { protected InfoReceiver _infoReceiver; public Command(InfoReceiver infoReceiver) { this._infoReceiver = infoReceiver; } public abstract void Execute(); } #endregion

    #region 具體命令角色——調用接收者 ===============
    /// <summary>
    /// 實現抽象角色 /// </summary>
    public class InfoCommandDelete : Command { public InfoCommandDelete(InfoReceiver infoReceiver) : base(infoReceiver) { } public override void Execute() { _infoReceiver.Delete(); } } #endregion

    #region 具體命令角色——調用接收者 ===============
    /// <summary>
    /// 實現抽象角色 /// </summary>
    public class InfoCommandUpdate : Command { public InfoCommandUpdate(InfoReceiver infoReceiver) : base(infoReceiver) { } public override void Execute() { _infoReceiver.Update(); } } #endregion }

 

namespace Command_Pattern { class Program { static void Main(string[] args) { ///初始化命令接收者和命令請求者還有具體命令
            InfoReceiver infoReceiver = new InfoReceiver(); InfoCommandDelete infoCommandDelete = new InfoCommandDelete(infoReceiver); InfoInvoke infoInvoke = new InfoInvoke(infoCommandDelete); var result=infoInvoke.ExecuteInvoke(); Console.WriteLine(result); } } }

 

使用場景及優缺點

在命令模式中重點就是實現將「行爲請求者」和「行爲實現者」之間進行解耦。而在命令請求者角色中能夠對具體命令角色作必定的控制、同時也能夠保存其額外的狀態信息。

1、使用場景

一、認爲是命令的地方均可以使用命令模式

二、系統支持命令的撤銷/恢復、從新執行等操做的時候能夠考慮使用命令模式

三、命令的發送者和命令執行者有不一樣的生命週期,不要求命令發送必須立馬執行

四、命令須要進行管理控制時

2、優勢

一、下降了系統的耦合性

二、新的命令能夠很容易添加到系統中

三、能夠將命令組合在一塊兒造成合成命令

四、能夠設計實現撤銷、從新執行的操做

3、缺點

一、使用命令模式可能致使有過多的具體命令類、這樣會使系統變得不切實際。

總結

  到這裏咱們就介紹完了命令模式。總的來講命令模式是將」行爲請求者」和」行爲實現者」進行了解耦。解耦以後就方便對命令進行控制管理(操做信息日誌記錄、撤銷/恢復操做、從新操做、命令隊列等等)。同時對新的命令加入也方便了一些(方便對命令擴展)。


 

   一我的如若不能使本身的人生輝煌,但也沒有理由使它黯淡;人生能夠平凡,但不能夠庸俗、墮落;人生不在意掠取多少,而在於追求過程的完美與卓越!

     C#設計模式系列目錄

     歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!

 

  

相關文章
相關標籤/搜索