コンテンツにスキップ

Strategy

同じ目的を持つアルゴリズムをインターフェースでカプセル化し、ランタイムで差し替えるパターンです。

  • AI 攻撃方式を状況別に切り替えたいとき
  • 照準や移動方針をキャラクターごとに変えたいとき
  • Strategy Interface
  • Concrete Strategy
  • Context

以下のコードは、上で説明した状況を 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;
}
}
  • 振る舞いを分離できるため、変更の影響範囲を小さくできます。
  • ルールの追加や差し替えを比較的安全に行えます。
  • オブジェクト数や間接呼び出しが増えると、流れを追いにくくなります。
  • 実行順序のバグはテストで固定しておく必要があります。

コンテキストが Strategy インターフェースを通してアルゴリズムを切り替える流れです。

Strategy の流れ