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

 

posted @ 2024-03-15 12:28  野码  阅读(9)  评论(0编辑  收藏  举报