コンテンツにスキップ

Visitor

オブジェクト構造を変更せず、演算を Visitor として分離して拡張するパターンです。

  • 複数のユニットタイプへ統計処理や報酬計算を追加したいとき
  • 構造は固定で、演算だけが頻繁に増えるとき
  • Visitor
  • Element
  • Accept

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

public interface IUnitVisitor
{
void Visit(PlayerUnit playerUnit);
void Visit(EnemyUnit enemyUnit);
}
public interface IVisitableUnit
{
void Accept(IUnitVisitor visitor);
}
public sealed class DamagePreviewVisitor : IUnitVisitor
{
public int TotalPreviewDamage { get; private set; }
public void Visit(PlayerUnit playerUnit) => TotalPreviewDamage += 5;
public void Visit(EnemyUnit enemyUnit) => TotalPreviewDamage += 10;
}
  • 振る舞いを分離できるため、変更の影響範囲を小さくできます。
  • ルールの追加や差し替えを比較的安全に行えます。
  • オブジェクト数や間接呼び出しが増えると、流れを追いにくくなります。
  • 実行順序のバグはテストで固定しておく必要があります。

オブジェクト構造を巡回しながら、演算を Visitor に委譲する流れです。

Visitor の流れ