命令模式

命令模式 

  涉及到一个对象请求另一个对象调用其方法达到某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。命令模式就是把一个请求动作分为两个部分,发出命令,执行命令分割开,进行解耦。既然,命令模式是实现把发出命令的责任和执行命令的责任分割开,然而中间必须有某个对象来帮助发出命令者来传达命令,使得执行命令的接收者可以收到命令并执行命令。

  场景:周老板某天心情不爽,于是想让汪某人出去炸个碉堡玩玩

     又傲娇的不想跟汪某人说话并对他丢了一堆BUG,于是找到我,让我来发布命令监督执行

    

  

模式结构

  Recriver:接受者,执行具体命令(汪某人,比较愉快的去炸碉堡玩)

  Invoker:执行者,负责调用命令对象的命令执行(奉旨督办)

  Command:命令角色,声明了一个给所有具体命令类实现的抽象接口(口谕)

  ConcreteCommand:定义了一个接受者和行为的弱耦合,负责调用接受者的相应方法。(口谕内容)

  Client:发出一个具体的命令并确定其接受者。(周老板)

  //命令的发布
    class Program
    {
        static void Main(string[] args)
        {
            //执行一个命令,首先需要有 接受命令的人、具体命令 和负责调用执行的人
            Receiver r = new Receiver();
            Command c = new ConcreteCommand(r);
            Invoke i = new Invoke(c);
            //负责调用命令对象的命令执行
            i.ExecuteCommand();
        }
    }
    /// <summary>
    /// 负责调用执行
    /// </summary>
    public class Invoke
    {
        public Command _command;
        public Invoke(Command command)
        {
            this._command = command;
        }
        public void ExecuteCommand()
        {
            _command.Action();
        }
    }
    /// <summary>
    /// 命令抽象类
    /// </summary>
    public abstract class Command
    {
        protected Receiver _receiver;
        public Command(Receiver receiver)
        {
            this._receiver = receiver;
        }
        public abstract void Action();

    }
    /// <summary>
    /// 具体命令需要做什么
    /// </summary>
    public class ConcreteCommand : Command
    {
        public ConcreteCommand(Receiver receiver) : base(receiver)
        {
        }
        public override void Action()
        {
            _receiver.RunBlast();
        }
    }
    /// <summary>
    /// 命令的接受者
    /// </summary>
    public class Receiver
    {
        public void RunBlast()
        {
            Console.WriteLine("汪某人很愉快的去炸个碉堡玩了");
            Console.ReadKey();
        }
    }

   命令模式的主要在于把某个具体的命令抽象化为具体的命令类,并通过加入命令请求者角色来实现将命令发送者对命令执行者的依赖分割开。

  

原文地址:https://www.cnblogs.com/li-lun/p/8758868.html