设计模式:命令模式
命令模式在GoF中的定义是:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式是一种回调的面向对象实现。
游戏设计模式里把它精简为:
命令是具现化的方法调用。
两种术语都意味着将概念变成数据一个对象可以存储在变量中,传给函数。
所以称命令模式为“具现化方法调用”,意思是方法调用被存储在对象中。
类似C#里的回调
把一个对象传递到方法中,让方法内部解析。
下面是一个C#版本的角色控制,传入一个角色,就能调用对应的各种行动。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| using UnityEngine;
public abstract class Command { public abstract void Execute(BaseCharacter character); }
public class JumpCommand : Command { public override void Execute(BaseCharacter character) { character.Jump(); } }
public class FireCommand : Command { public override void Execute(BaseCharacter character) { character.Fire(); } }
public class MoveCommand : Command { public override void Execute(BaseCharacter character) {
} }
public class InputHandler {
private JumpCommand buttonA; private FireCommand buttonD; private MoveCommand buttonW;
public Command HandleInputAction() { if (Input.GetKeyDown(KeyCode.A)) { return buttonA; } if (Input.GetKeyDown(KeyCode.D)) { return buttonD; } if (Input.GetKeyDown(KeyCode.W)) { return buttonW; }
return null; }
private Player mPlayer; private Enemy mEnemy;
public void Command() { Command command = HandleInputAction();
if (command != null) { command.Execute(mPlayer); command.Execute(mEnemy); } } }
public class Player : BaseCharacter { public override void Fire() { base.Fire(); } public override void Jump() { base.Jump(); } }
public class Enemy : BaseCharacter { public override void Fire() { base.Fire(); } }
public abstract class BaseCharacter { public virtual void Jump() { } public virtual void Fire() { } }
|