【C#】设计模式-命令模式

简介

命令模式是设计模式之一,它能把某种具体的行为操作抽象为命令,从而将发令者和执行者的强耦合关系解耦。

使用命令模式,即将原先的按键(输入)-行动(输出)模式转变为按键-命令-行动模式。这意味着只要改变命令就能改变按键到行动的映射。例如玩家原先使用wsad四键控制自己的角色移动,那么在想用其他键控制角色移动,或者想控制其他角色时,就必须要改动按键或行动中的逻辑。而在使用命令模式后,只要改变按键对应的命令,或者改变命令对象即可。

使用命令模式,可以实现操作的记录和管理(比如撤销和恢复)。例如,在绘画软件中,新建一个图层,插入一张图片,用橡皮擦掉一部分,都属于命令。当用户点击撤销或者恢复的时候,只需要执行对应命令的撤销或恢复操作。

例子

可以将每个命令写成一个类,继承自命令(Command)基类(也可以用接口实现,这里用继承)。

例如,编写一个造成伤害的命令HitCommand,并规定可以受到伤害的对象都要实现ICanGetHit接口

class Command
{
  public virtual void Execute(){}  //执行
  public virtual void Undo(){}  //撤销
}
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类用来存储和管理命令。

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
喜欢就点个赞吧
点赞0 分享
评论 共1条

请登录后发表评论

    • Acoloco的头像-水波萌Acoloco等级-LV4-水波萌作者0