行为设计模式-命令模式

命令模式(Command Pattern)是一种行为设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化,同时支持请求的排队、记录日志、撤销和重做等操作。命令模式可以将请求的发送者和接收者解耦,以便在请求的生命周期内可以分别进行修改和复用。

命令模式通常由四个角色组成:

  • Command(命令):命令的接口,定义了执行命令的方法。

  • ConcreteCommand(具体命令):Command接口的具体实现,包含了命令的接收者和执行方法。

  • Invoker(调用者):负责调用命令对象,一般是将命令对象存储在一个集合中,支持多次调用。

  • Receiver(接收者):接收者的方法会在具体命令中被调用,执行具体操作。

在Unity中,命令模式可以用来处理各种交互事件,比如点击按钮、键盘按键、触摸屏等,将不同的事件封装成不同的命令对象,然后将命令对象存储在一个集合中,支持多次调用、撤销、重做等操作。这样可以大大提高代码的复用性和可维护性。

以下是一个简单的示例代码,展示如何在Unity中使用命令模式。
首先定义一个抽象命令类,包含一个Execute方法,用于执行命令:

public abstract class Command
{
    public abstract void Execute();
}
接下来定义具体的命令类,这里我们实现了两个命令类:JumpCommand和ShootCommand:

csharp
Copy code
public class JumpCommand : Command
{
    private PlayerController _player;

    public JumpCommand(PlayerController player)
    {
        _player = player;
    }

    public override void Execute()
    {
        _player.Jump();
    }
}

public class ShootCommand : Command
{
    private PlayerController _player;

    public ShootCommand(PlayerController player)
    {
        _player = player;
    }

    public override void Execute()
    {
        _player.Shoot();
    }
}

在这里,JumpCommand和ShootCommand都持有一个PlayerController的引用,并在Execute方法中调用PlayerController的Jump和Shoot方法。

接下来我们定义一个命令管理器类,用于管理所有的命令。在这个类中,我们使用一个Dictionary来存储命令,以便通过命令名称来查找对应的命令。我们还提供了一个ExecuteCommand方法,用于执行指定名称的命令:

public class CommandManager
{
    private Dictionary<string, Command> _commands = new Dictionary<string, Command>();

    public void AddCommand(string name, Command command)
    {
        _commands[name] = command;
    }

    public void ExecuteCommand(string name)
    {
        if (_commands.TryGetValue(name, out Command command))
        {
            command.Execute();
        }
        else
        {
            Debug.LogError("Command not found: " + name);
        }
    }
}

最后,在游戏中我们需要一个PlayerController和一个CommandManager。当玩家按下特定的按键时,我们将相应的命令添加到CommandManager中。当需要执行命令时,我们调用CommandManager的ExecuteCommand方法。


public class Game : MonoBehaviour
{
    public PlayerController player;
    public CommandManager commandManager;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            JumpCommand jumpCommand = new JumpCommand(player);
            commandManager.AddCommand("Jump", jumpCommand);
        }
        else if (Input.GetKeyDown(KeyCode.Return))
        {
            ShootCommand shootCommand = new ShootCommand(player);
            commandManager.AddCommand("Shoot", shootCommand);
        }

        if (Input.GetKeyDown(KeyCode.Z))
        {
            commandManager.ExecuteCommand("Jump");
        }
        else if (Input.GetKeyDown(KeyCode.X))
        {
            commandManager.ExecuteCommand("Shoot");
        }
    }
}

这里,当玩家按下Space键时,我们创建一个JumpCommand对象,并将其添加到CommandManager中,当玩家按下Z键时,我们执行Jump命令。同理,当玩家按下Return键时,我们创建一个ShootCommand对象,并将其添加到CommandManager中,当玩家按下X键时,我们执行Shoot命令。

总体来说,这个示例代码演示了如何在Unity中使用命令模式来实现玩家的行为。当然,实际使用时,我们可能需要根据具体需求进行修改和扩展。

在这个示例中,我们创建了一个Command接口,以及两个具体的命令类MoveCommand和JumpCommand。每个命令类都实现了Execute方法,用于执行相应的操作。我们还创建了一个InputHandler类,用于处理用户输入,并根据输入创建相应的命令对象。最后,我们将命令对象添加到一个命令队列中,并在游戏的主循环中逐个执行这些命令。

使用命令模式的好处是可以将命令的执行和请求解耦。在这个示例中,我们可以通过添加不同的命令类来扩展玩家的行为,而不需要修改InputHandler类和游戏的主循环。这样可以让代码更加灵活和易于维护。

当然,在实际使用时,还需要考虑一些细节,比如如何撤销命令、如何将命令序列化等问题。

你可能感兴趣的:(C#,设计模式,命令模式,设计模式)