Design Pattern / Behavioral

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

発行者の状態が変化したときに、購読者へ自動的に通知されるリアクティブなパターン。

  • Design Pattern
  • Behavioral
目次

パターンの一行要約

発行者の状態が変化したときに、購読者へ自動的に通知されるリアクティブなパターン。

Unityでの典型的な使用例

  • HP の変化に対して UI、サウンド、実績などがすべて反応すべき場合。
  • 疎結合なイベント接続が必要な場合。

構成要素(役割)

  • Subject
  • Observer
  • Subscribe / Unsubscribe

Unityサンプル(C#)

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

using System;

public sealed class HealthModel
{
    public event Action<int, int> HealthChanged;

    public void SetHealth(int currentHealth, int maxHealth)
    {
        HealthChanged?.Invoke(currentHealth, maxHealth);
    }
}

public sealed class HealthBarPresenter
{
    public void Bind(HealthModel healthModel)
    {
        healthModel.HealthChanged += OnHealthChanged;
    }

    private void OnHealthChanged(int currentHealth, int maxHealth) { }
}

利点

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

注意点

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

相互作用図

Subject の状態変化が購読者へ自動的に伝播するフローを示します。

flowchart LR

  subject["HealthModel"]
  notify["Notify()"]

  subgraph observers["Observers"]
    hpbar["HealthBar"]
    sfx["DamageFX"]
    achievement["AchievementTracker"]
  end

  subject -->|health changed| notify
  notify --> hpbar
  notify --> sfx
  notify --> achievement

コメント