C#における観察者パターンの委譲による実装

観察者パターンは、オブジェクト間の依存関係を定義するデザインパターンの一つであり、あるオブジェクト(被観察者)の状態に変化があった際に、それに登録された他のオブジェクト(観察者)へ自動的に通知・更新を行う仕組みを提供する。このパターンはイベント駆動型システムやGUIアプリケーションのモデル・ビュー構造などで広く利用される。 本稿では、C#のデリゲートとイベント機能を活用して、猫が鳴くという出来事に対して「ネズミが逃げる」「飼い主が目覚める」といった反応を実装する例を通じて、観察者パターンの簡潔な設計を紹介する。 まず、被観察者の基底クラスとして`LivingSubject`を定義する。このクラスは、外部からの購読を受け付けるためのイベントを保持し、状態変化時にそのイベントを発火させる役割を担う。
public delegate void Reaction();<br /><br />public abstract class LivingSubject<br />{<br />    public event Reaction OnReact;<br /><br />    protected virtual void Trigger()<br />    {<br />        OnReact?.Invoke();<br />    }<br /><br />    public abstract void Act();<br />}
次に、具体的な被観察者として`Cat`クラスを実装する。このクラスは`Act`メソッド内で「猫が鳴いた」ことを出力し、その後、すべての購読者に対して通知を行う。
public class Cat : LivingSubject<br />{<br />    public override void Act()<br />    {<br />        Console.WriteLine("にゃーん");<br />        Trigger();<br />    }<br />}
一方、観察者の側も抽象基底クラス`Creature`として共通の登録処理を定義する。コンストラクタで被観察者のイベントに自身の反応メソッドを登録することで、自動的に監視対象となる。
public abstract class Creature<br />{<br />    protected Creature(LivingSubject subject)<br />    {<br />        subject.OnReact += React;<br />    }<br /><br />    public abstract void React();<br />}
これに基づいて、`Mouse`クラスと`Owner`クラスを具体的な観察者として実装する。
public class Mouse : Creature<br />{<br />    public Mouse(LivingSubject subject) : base(subject)<br />    {<br />    }<br /><br />    public override void React()<br />    {<br />        Console.WriteLine("ネズミが逃げ出した!");<br />    }<br />}
public class Owner : Creature<br />{<br />    public Owner(LivingSubject subject) : base(subject)<br />    {<br />    }<br /><br />    public override void React()<br />    {<br />        Console.WriteLine("飼い主が目を覚ました…");<br />    }<br />}
これらを組み合わせた実行コードは以下のようになる。
var cat = new Cat();<br />var mouse = new Mouse(cat);<br />var owner = new Owner(cat);<br />cat.Act();
出力結果:
にゃーん<br />ネズミが逃げ出した!<br />飼い主が目を覚ました…
この実装では、イベントとデリゲートによって観察者との結びつきが柔軟かつ疎結合に保たれており、新たな観察者を追加する際も被観察者側の修正が不要となる。また、C#が持つ言語機能を活かすことで、従来のインターフェースベースの実装よりも簡潔で保守性の高いコードが得られる。

タグ: デザインパターン C# 観察者パターン イベント デリゲート

9月15日 09:49 投稿