【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 = ; 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)的更多相关文章
- php 23种设计模式 - 命令模式
命令模式 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 命令模式以松散耦合主题为基础,发送消息.命令和请求,或通过一组处理程序发送 ...
- 设计模式 - 命令模式(command pattern) 多命令 具体解释
命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...
- 设计模式 - 命令模式(command pattern) 具体解释
命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...
- 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释
命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- 24种设计模式--命令模式【Command Pattern】
今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描述真实世界的命令情况.正在看这本书的你,我猜测分为两类:已经工作的和没有工作的, ...
- 设计模式--命令模式Command(对象行为型)
一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...
- C#设计模式——命令模式(Command Pattern)
一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...
- 大话设计模式--命令模式 Command -- C++实现实例
1. 命令模式: 将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式有点: a. 较容易的设计一个命令队列 b. 在需要的的情况 ...
随机推荐
- Linux常用命令(精选)
chmod -R 777 文件夹名 // -R表示递归给文件及文件夹内文件更改权限,r(4),w(2),x(1),chmod -a+rwx / chmod -u+w -g+r -o +x ...
- 在页面加载后在设置embed 的src 怎么实现?
我想在页面加载完之后,再给embed 加入src 值,但embed 后播放不了.下面是我的两个方案,都无法播放,求解: <script type="text/javascript&qu ...
- 30分钟掌握ES6/ES2015核心内容(下)
在 30分钟掌握ES6/ES2015核心内容(上)我们讲解了es6最常用的一些语法:let, const, class, extends, super, arrow functions, templa ...
- wpf通过VisualTreeHelper找到控件内所有CheckBox和TextBox并做相应绑定
#region CheckBox与TextBox绑定 Dictionary<CheckBox, TextBox> CheckTextBoxDic = new Dictionary<C ...
- eclipse web and java ee development
1.打开Eclipse ->help ->install new software 2.Work with:http://download.eclipse.org/releases/gan ...
- 嵌入式Linux引导过程之1.6——Xloader的Xloader_Entry
我们已经看完了XLOADER_ENTRY里调用的前两个标号的代码,分别是sys_init和ddr_init.对于一个嵌入式系统来说,这两 个部分的代码是在一开始就执行的,至少是在从bootrom里面的 ...
- caffe︱cifar-10数据集quick模型的官方案例
准备拿几个caffe官方案例用来练习,就看到了caffe中的官方案例有cifar-10数据集.于是练习了一下,在CPU情况下构建quick模型.主要参考博客:liumaolincycle的博客 配置: ...
- mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】
1.mysql简单的查询:select 字段1,字段2... from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都 ...
- FusionWidgets之AngularGauge图
1.设置AngularGauge图的数据源 AngularGauge.xml: <?xml version="1.0" encoding="UTF-8"? ...
- 常用YUV转RGB代码
常用YUV转RGB [java] view plaincopyprint? public class YuvToRGB { private static int R = 0; private stat ...