コマンドモードのユニティ---ゲームデザインパターン(13)



概要リファレンスを参照してください。参考ブログ

もしそう異なるパラメータを使用して、クライアントの要求に、Commandオブジェクトへの要求をカプセル化し、要求キューやリクエストをログに記録し、取り消し可能操作をサポート。

例えば、ベースがフィーチャーRTSゲームをアップグレードします。アップグレードには、時間がかかり、我々はアップグレードに数回を増加させ、それが最初のアップグレードが完了した後の背後にアップグレードを実行する前に待機します。
我々は回数を減らしたい場合は、この時点でアップグレードすることができます。
我々は、要求を撤回することができ、それぞれの要求を実行するために並んで待つために、コマンドとして各そのような要求の操作をアップグレードすることができます。

1、コマンドモードのプロトタイプ

図コマンドモードプロトタイプUML

コマンドモードのプロトタイプコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 命令模式
/// </summary>
public class CommandMode : MonoBehaviour
{
    private void Start()
    {
        CommandInvoker invoker = new CommandInvoker();
        ConcreteCommand1 cmd1 = new ConcreteCommand1(new Receiver1());
        ConcreteCommand1 cmd2 = new ConcreteCommand1(new Receiver1());

        invoker.AddCommand(cmd1);
        invoker.AddCommand(cmd2);
        invoker.ExecuteCommand();

    }
}


/// <summary>
/// 命令管理类
/// 根据invoker执行Command命令
/// </summary>
public class CommandInvoker
{
    //命令集合
    private List<ICommand> mCommands = new List<ICommand>();

    public void AddCommand(ICommand command)
    {
        mCommands.Add(command);
    }
    /// <summary>
    /// 使用params参数一次添加多个命令
    /// </summary>
    public void AddCommand(params ICommand[] commands)
    {
        foreach (ICommand command in commands)
        {
            mCommands.Add(command);
        }
    }

    /// <summary>
    /// 执行所有命令,执行完并清除
    /// </summary>
    public void ExecuteCommand()
    {
        foreach (ICommand command in mCommands)
        {
            command.Execute();
        }
        mCommands.Clear();
    }
}

/// <summary>
/// 抽象命令类
/// </summary>
public abstract class ICommand
{
    public abstract void Execute();
}
public class ConcreteCommand1 : ICommand
{
    //每个命令类中有一个接收者,接收者对象绑定一个具体的动作
    private Receiver1 mReceiver1;

    public ConcreteCommand1(Receiver1 receiver1)
    {
        mReceiver1 = receiver1;
    }

    //通过调用接收者来执行具体的命令
    public override void Execute()
    {
        mReceiver1.Action("ConcreteCommand1");
    }
}

/// <summary>
/// 接收者类,绑定一个具体的执行操作,任何类都可能作为一个接收者
/// </summary>
public class Receiver1
{
    public void Action(string cmd)
    {
        Debug.Log("Receiver1执行了命令:" + cmd);
    }
}

2、利点とコマンドモードの欠点

利点

  1. リクエスタと実装との間の結合を減少させます。
  2. 要求キューまたはログ要求、運用支援失効。
  3. 組み合わせは、簡単にコマンドを設計することができます。
  4. 新しいコマンドを簡単にシステムに追加することができます。

短所

  1. クラスの数以上

おすすめ

転載: www.cnblogs.com/Fflyqaq/p/11722396.html