22_命令模式

命令模式是一種行爲設計模式,它將請求封裝成一個對象,從而使不同的請求可以參數化其他對象,或者在不同的時間進行調用和執行。在這種模式中,命令對象充當中介者,負責將請求者和執行者進行解耦。

命令模式包含以下幾個角色:

  1. 命令接口(Command Interface):定義了命令對象的執行方法。

  2. 具體命令(Concrete Command):實現了命令接口,包含了具體的執行邏輯。

  3. 請求者(Invoker):負責調用命令對象執行請求。

  4. 執行者(Receiver):負責執行具體的命令邏輯。

命令模式的工作流程如下:

  1. 創建具體命令對象,並指定其關聯的執行者。

  2. 將具體命令對象傳遞給請求者。

  3. 請求者調用具體命令對象的執行方法。

  4. 具體命令對象將請求傳遞給執行者,並執行相應的邏輯。

命令模式的優點包括:

  1. 解耦請求者和執行者,使得系統更加靈活和可擴展。

  2. 可以方便地實現撤銷、重做等操作。

  3. 可以實現命令的排隊、記錄和回放等功能。

命令模式適用於以下情況:

  1. 需要將請求封裝成對象,並且需要在不同的時間進行調用和執行。

  2. 需要支持撤銷、重做等操作。

  3. 需要將請求的發送者和執行者解耦,使得系統更加靈活。

總之,命令模式是一種將請求封裝成對象的設計模式,它能夠實現請求和執行者之間的解耦,並提供了一些額外的功能,如撤銷、重做等。

 

IReceiver

/// <summary>
    /// 執行者
    /// </summary>
    public interface IReceiver
    {
        /// <summary>
        /// 上任
        /// </summary>
        void Start();
        /// <summary>
        /// 回城
        /// </summary>
        void Return();
    }

 

 

Command Interface

/// <summary>
    /// 命令抽象類
    /// </summary>
    public abstract class CommandBase
    {
        protected IReceiver receiver;
        public CommandBase(IReceiver receiver)
        {
            this.receiver = receiver;
        }

        /// <summary>
        /// 執行
        /// </summary>
        public abstract void Execute();

    }

 

 

 Receiver

/// <summary>
    /// 將軍
    /// </summary>
    public class General : IReceiver
    {
        public void Return()
        {
            Console.WriteLine("回京覆命.......");
        }

        public void Start()
        {
            Console.WriteLine("他鄉赴任官職.....");
        }
    }

 

 

 Concrete Command

/// <summary>
    /// 第一道詔書,任職詔書
    /// </summary>
    public class OfferCommand : CommandBase
    {
        public OfferCommand(IReceiver receiver) : base(receiver)
        {
        }

        public override void Execute()
        {
            receiver.Start();
        }
    }
/// <summary>
    /// 第二道詔書,回城詔書
    /// </summary>
    public class ReturnCommand : CommandBase
    {
        public ReturnCommand(IReceiver receiver) : base(receiver)
        {
        }

        public override void Execute()
        {
            receiver.Return();
        }
    }

 

 Invoker

/// <summary>
    /// 請求者-宦官
    /// </summary>
    public class Invoker
    {
        private CommandBase command;

        public void SetCommand(CommandBase command)
        { 
            this.command = command;
        }

        /// <summary>
        /// 宣讀生旨
        /// </summary>
        public void Reading()
        {
            command.Execute();
        }
    }

 

 Client

/// <summary>
    /// 皇帝
    /// </summary>
    public  class Client
    {
        public void Start()
        {
            IReceiver receiver = new General();//執行者
            Invoker invoker = new Invoker();//請求者

            //赴任聖旨
            CommandBase command1 = new OfferCommand(receiver);
            invoker.SetCommand(command1);
            invoker.Reading();

            Console.WriteLine("N年後...........");

            //回城覆命聖旨
            CommandBase command2 = new ReturnCommand(receiver);
            invoker.SetCommand(command2);
            invoker.Reading();
        }
    }

調用

static void Main(string[] args)
        {
            new Client().Start();
            Console.ReadKey();
            Console.WriteLine("Hello, World!");
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章