DesignPattern_Command
摘录自:设计模式与游戏完美开发
十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合式的项目教学,即以一个游戏的范例来应用23种设计模式的实现贯穿全书,让读者学习到整个游戏开发的全过程和作者想要传承的经验,并以浅显易懂的比喻来解析难以理解的设计模式,让想深入了解此领域的读者更加容易上手。
工程GitHub
COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。”,:-(
-
命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。
源码注释及命名有所更改,个人感觉会比原版更好理解
using UnityEngine;
using System.Collections.Generic;
namespace DesignPattern_Command
{
// 执行命令基类
public abstract class Command
{
public abstract void Execute();
}
// 将命令与Receiver1结合
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);
}
}
// 将命令与Receiver2结合
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);
}
}
// 负责执行命令1
public class Receiver1
{
public Receiver1() { }
public void Action(string Command)
{
Debug.Log("Receiver1.Action:Command[" + Command + "]");
}
}
// 负责执行命令1
public class Receiver2
{
public Receiver2() { }
public void Action(int Param)
{
Debug.Log("Receiver2.Action:Param[" + Param.ToString() + "]");
}
}
// 命令管理者
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();
}
}
}
using UnityEngine;
using System.Collections;
using DesignPattern_Command;
public class CommandTest : MonoBehaviour
{
void Start()
{
UnitTest();
}
//
void UnitTest()
{
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();
}
}