22_命令模式

野码發表於2024-03-15

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

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

  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!");
        }

相關文章