Design Pattern / Behavioral

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

多数のオブジェクト間のやり取りを Mediator にまとめ、オブジェクト同士の直接的な依存を減らすパターン。

  • Design Pattern
  • Behavioral
目次

パターンの一行要約

多数のオブジェクト間のやり取りを Mediator にまとめ、オブジェクト同士の直接的な依存を減らすパターン。

Unityでの典型的な使用例

  • インベントリ、装備、ショップ UI のやり取りを中央集権的に制御する場合。
  • 相互参照が複雑になり始めた場合。

構成要素(役割)

  • Mediator
  • Concrete Mediator
  • Colleague

Unityサンプル(C#)

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

public interface IUiMediator
{
    void Notify(object sender, string eventId);
}

public sealed class LobbyUiMediator : IUiMediator
{
    public InventoryPanel InventoryPanel { get; set; }
    public EquipmentPanel EquipmentPanel { get; set; }

    public void Notify(object sender, string eventId)
    {
        if (sender == InventoryPanel && eventId == "ItemSelected")
        {
            EquipmentPanel.PreviewSelectedItem();
        }
    }
}

利点

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

注意点

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

相互作用図

コンポーネント同士が直接通信する代わりに、Mediator が通信を中継するフローを示します。

flowchart LR

  mediator["GameMediator"]

  subgraph components["Components"]
    ui["UI"]
    audio["Audio"]
    quest["Quest"]
  end

  ui -->|event| mediator
  audio -->|event| mediator
  quest -->|event| mediator
  mediator -->|notify| ui
  mediator -->|notify| audio
  mediator -->|notify| quest

コメント