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 = ; 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(),);
theInvoker.AddCommand(theCommand); theInvoker.ExecuteCommand();
}
}

运行结果

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

还有一种应用场景

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

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

【Unity与23种设计模式】命令模式(Command)的更多相关文章

  1. php 23种设计模式 - 命令模式

    命令模式 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 命令模式以松散耦合主题为基础,发送消息.命令和请求,或通过一组处理程序发送 ...

  2. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  3. 设计模式 - 命令模式(command pattern) 具体解释

    命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...

  4. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  5. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  6. 24种设计模式--命令模式【Command Pattern】

    今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描述真实世界的命令情况.正在看这本书的你,我猜测分为两类:已经工作的和没有工作的, ...

  7. 设计模式--命令模式Command(对象行为型)

    一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...

  8. C#设计模式——命令模式(Command Pattern)

    一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...

  9. 大话设计模式--命令模式 Command -- C++实现实例

    1. 命令模式: 将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式有点: a. 较容易的设计一个命令队列 b. 在需要的的情况 ...

随机推荐

  1. 使用C#解决部分Win8.1系统窗口每隔几秒失去焦点的问题【转】

    使用了Win8.1 With Update 1后,发现重启系统后,当前激活的窗口总是每隔几秒失去焦点,过0.5~1秒焦点回来,导致输入无法正常工作,严重影响使用心情和效率. 在网上找了很久,也没找到相 ...

  2. Python模拟登录成功与失败处理方式(不涉及前端)

    任务说明: (1) 用户输入用户名,如不存在此用户不能登录: (2) 用户在输入密码时,如果连续输入三次错误,则该用户被锁定一段时间; (3) 用户被锁定一段时间后,可再次进行尝试登录: 程序使用库: ...

  3. 笔记︱决策树族——梯度提升树(GBDT)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记来源于CDA DSC,L2-R语言课程所 ...

  4. STM32F4 输入输出(GPIO)模式理解

    stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入: 2. 浮空输入: 3. 上拉输入: 4. 下拉输入: 5. 开漏输出: 6. 推挽输出: 7. 复用开漏输出: 8. 复用推挽输出   ...

  5. Java Web项目(Extjs)报错六

    1.Java Web项目(Extjs)报错六 具体报错如下: usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ...

  6. R分词

    #用于下载安装rJava 和 Rwordseg,如果安装了就注释掉 install.packages("rJava") install.packages("Rwordse ...

  7. mpeg文件格式分析

    MPEG-1流比特层次结构分析总结 1.简要介绍Mpeg 2.Mpeg-1数据流分析 2.1视频序列层(VideoStream) 2.2画面组层(GOP) 2.3画面层(Pictures) 2.4片层 ...

  8. INF 右键安装驱动以及卸载

    INF 右键安装驱动以及卸载 之前写过一篇文章是关于INF文件详解的,大家可以参看INF文件详解,这次写的是关于INF右键安装,这样比较方便.卸载的话也是一句话,可以大大减少安装时间: 先将INF文件 ...

  9. Axure RP一个专业的快速原型设计工具

    Axure RP是一个专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写. Axure简要介绍 Axur ...

  10. JDBC连接池(三)DBCP连接池

    JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了  1.JDBC自定义连接池  2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包   (注意:mysql和mysql 驱动 ...