• 【Unity与23种设计模式】命令模式(Command)


    GoF中定义:

    “将请求封装成为对象,让你可以将客户端的不同请求参数化,并配合队列、记录、复原等方法来执行请求的操作。”

    实现命令模式的标准在于:

    当请求被对象化后,对于请求对象是否有“管理”上的需求。如果有,则以命令模式实现。

    “管理”指的是对命令的延迟或命令的暂存。

    举个例子

    红警(红色警戒)中训练美国大兵的命令

    当点击时,开始倒计时产生大兵,再次点击时,显示数字“2”,表示要训练两个大兵

    也就是第二个命令被暂存

    当右键点击时,命令还可以撤销,数字由“2”变为了“1”,

    也就是第二个命令被撤销了

    命令的“暂存”和“撤销”用到的便是命令模式

    还有一种应用场景

    网游中,Client/Server间数据封包的传递,大多会使用命令模式来实现。

    //负责执行命令1
    public class Receiver1 {
        public Receiver1() { }
        public void Action(string Command) {
            Debug.Log("Receiver1.Action:Command["+Command+"]");
        }
    }
    
    //负责执行命令2
    public class Receiver2
    {
        public Receiver2() { }
        public void Action(int Param)
        {
            Debug.Log("Receiver2.Action:Command[" + Param.ToString() + "]");
        }
    }
    //执行命令的界面
    public abstract class Command {
        public abstract void Execute();
    }
    //将命令和Receiver绑定起来
    public class ConcreteCommand1 : Command {
        Receiver1 m_Receiver = null;
        string m_Command = "";
    
        public ConcreteCommand1(Receiver1 Receiver,string Command) {
            m_Receiver = Receiver;
            m_Command = Command;
        }
    
        public override void Execute()
        {
            m_Receiver.Action(m_Command);
        }
    }
    
    public class ConcreteCommand2 : Command
    {
        Receiver2 m_Receiver = null;
        int m_Param = 0;
    
        public ConcreteCommand2(Receiver2 Receiver, int Param)
        {
            m_Receiver = Receiver;
            m_Param = Param;
        }
    
        public override void Execute()
        {
            m_Receiver.Action(m_Param);
        }
    }
    //命令管理者
    public class Invoker {
        List<Command> m_Commands = new List<Command>();
    
        public void AddCommand(Command theCommand) {
            m_Commands.Add(theCommand);
        }
    
        public void ExecuteCommand() {
            foreach (Command theCommand in m_Commands) {
                theCommand.Execute();
            }
            m_Commands.Clear();
        }
    }
    //测试类
    public class TextCommand {
        void UnitText() {
            Invoker theInvoker = new Invoker();
    
            Command theCommand = null;
            theCommand = new ConcreteCommand1(new Receiver1(),"你好");
            theInvoker.AddCommand(theCommand);
            theCommand = new ConcreteCommand2(new Receiver2(),999);
            theInvoker.AddCommand(theCommand);
    
            theInvoker.ExecuteCommand();
        }
    }

    运行结果

    //Receiver.Action:Command[你好]
    //Receiver.Action:Param[999]

    还有一种应用场景

    网游中,Client/Server间数据封包的传递,大多会使用命令模式来实现。

    文章整理自书籍《设计模式与游戏完美开发》 菜升达 著

  • 相关阅读:
    Spreadsheet 使用介绍
    一套完整自定义工作流的实现(2)
    《WF编程》系列之 承载工作流:持久性服务 Persistence Services
    SQL Server 2005函数
    ActiveReport
    SQLServer 2000中,存储过程和用户自定义函数具体的区别??
    MS SQL Server 2005 物理查询处理中的各个阶段(二)
    《WF编程》系列 承载工作流:持久化与跟踪
    C# WinForm自定义控件整理
    SQL Server2005使用CTE实现递归
  • 原文地址:https://www.cnblogs.com/fws94/p/7443556.html
Copyright © 2020-2023  润新知