Design Pattern / Behavioral

[デザインパターン] Strategy パターン

同じ目的を持つアルゴリズムをインターフェースの裏にカプセル化し、実行時に差し替え可能にするパターン。

  • Design Pattern
  • Behavioral
目次

パターンの一行要約

同じ目的を持つアルゴリズムをインターフェースの裏にカプセル化し、実行時に差し替え可能にするパターン。

Unityでの典型的な使用例

  • AI の攻撃挙動を状況に応じて変更すべき場合。
  • キャラクターごとに照準や移動のポリシーが異なる場合。

構成要素(役割)

  • Strategy Interface
  • Concrete Strategy
  • Context

Unityサンプル(C#)

以下のコードは、上記のシナリオを基にした簡略化された Unity の例です。

using UnityEngine;

public interface IAimStrategy
{
    Vector3 GetAimPosition(Transform shooterTransform, Transform targetTransform);
}

public sealed class DirectAimStrategy : IAimStrategy
{
    public Vector3 GetAimPosition(Transform shooterTransform, Transform targetTransform)
    {
        return targetTransform.position;
    }
}

public sealed class LeadAimStrategy : IAimStrategy
{
    public Vector3 GetAimPosition(Transform shooterTransform, Transform targetTransform)
    {
        return targetTransform.position + targetTransform.forward * 0.5f;
    }
}

利点

  • 振る舞いが小さな単位に分離されるため、変更の影響範囲を抑えられます。
  • ルールの追加や差し替えが比較的安全に行えます。

注意点

  • オブジェクト数や間接呼び出しが増えると、フローを追いにくくなります。
  • 順序に関するバグはテストで確実に固めておくべきです。

相互作用図

Context が Strategy インターフェースを通してアルゴリズムを差し替えるフローを示します。

flowchart LR

  context["PathContext"]
  selector["Select Strategy"]
  a_star["AStarStrategy"]
  flow_field["FlowFieldStrategy"]
  execute["FindPath()"]
  result["Path Result"]

  context --> selector
  selector -->|small map| a_star
  selector -->|large crowd| flow_field
  a_star --> execute
  flow_field --> execute
  execute --> result
  result --> context

コメント