简介
命令模式是设计模式之一,它能把某种具体的行为操作抽象为命令,从而将发令者和执行者的强耦合关系解耦。
使用命令模式,即将原先的按键(输入)-行动(输出)模式转变为按键-命令-行动模式。这意味着只要改变命令就能改变按键到行动的映射。例如玩家原先使用wsad四键控制自己的角色移动,那么在想用其他键控制角色移动,或者想控制其他角色时,就必须要改动按键或行动中的逻辑。而在使用命令模式后,只要改变按键对应的命令,或者改变命令对象即可。
使用命令模式,可以实现操作的记录和管理(比如撤销和恢复)。例如,在绘画软件中,新建一个图层,插入一张图片,用橡皮擦掉一部分,都属于命令。当用户点击撤销或者恢复的时候,只需要执行对应命令的撤销或恢复操作。
例子
可以将每个命令写成一个类,继承自命令(Command)基类(也可以用接口实现,这里用继承)。
例如,编写一个造成伤害的命令HitCommand,并规定可以受到伤害的对象都要实现ICanGetHit接口
首先,编写命令的基类Command
class Command
{
public virtual void Execute(){} //执行
public virtual void Undo(){} //撤销
}
然后是造成伤害的命令HitCommand
class HitCommand:Command
{
ICanGetHit target;
int attack;
public HitCommand(ICanGetHit _target,int _attack)
{
target = _target;
attack = _attack;
}
public override void Execute()
{
target.GetHit(attack);
}
public override void Undo()
{
target.UndoGetHit(attack);
}
}
ICanGetHit接口(无需关注)
interface ICanGetHit
{
public void GetHit();
public void UndoGetHit();
}
测试一下
//Test1
ICanGetHit enemy = GetEnemy();
Command myCommand = new HitCommand(enemy,114);
myCommand.Execute();
//Test2
ICanGetHit stone = GetStone();
Command herCommand = new HitCommand(stone,514);
herCommand.Execute();
herCommand.Undo();
在这个例子中,HitCommand命令可以由任何对象发起,并对任何实现了ICanGetHit接口的对象造成伤害。
更多
在使用命令模式的时候,不建议直接使用命令,而是再编写一个Invoker类用来存储和管理命令。
一个简单的Invoker类示例
class Invoker
{
List<Command> commandList;
public Invoker(){ commandList = new List<Command>(); }
public void Add(Command _command)
{
commandList.Add(_command);
}
public void ExecuteAll()
{
foreach(Command item in commandList)
{
item.Execute();
}
}
public void UndoAll()
{
foreach(Command item in commandList) { item.Undo(); }
}
}
使用示例
Command myCommand1 = new HitCommand(target1,1);
Command myCommand5 = new HitCommand(target5,5);
Invoker myInvoker = new Invoker();
myInvoker.Add(myCommand1);
myInvoker.Add(myCommand2);
myInvoker.ExecuteAll();
myInvoker.UndoAll();
© 版权声明
文章版权归作者所有
THE END





- 最新
- 最热
查看全部