オブザーバーパターンの短いサンプル

C#でオブザーバーパターンのサンプルを作るには、以下の手順で実装します

オブザーバーパターンとは

C#のオブザーバーパターンとは、オブジェクト間の通信方式の1つで、1つのオブジェクト(サブジェクト)の状態が変化した時に、その状態を自動的に通知することができるようにするための設計パターンです。

このパターンを使用することで、複数のオブジェクト(オブザーバー)が、サブジェクトの状態に自動的に反応することができるようになり、コードの耦合度を低く抑えることができます。

具体的には、サブジェクトは、オブザーバーを登録(Attach)し、登録解除(Detach)することで、オブザーバーの管理を行う。状態が変化した時には、Notifyメソッドを呼び出し、オブザーバーに通知を行う。そして、オブザーバーは、Updateメソッドを実装し、サブジェクトから受け取った通知を処理する。

このように、オブザーバーパターンを使用することで、オブジェクト間の通信を簡単に実装することができます。

サンプル

IObserverインターフェースを定義します。これは、オブザーバーが実装するインターフェースで、Updateメソッドを定義しています

public interface IObserver
{
    void Update(string message);
}

ISubjectインターフェースを定義します。これは、サブジェクトが実装するインターフェースで、Attach、Detach、Notifyメソッドを定義しています

public interface ISubject
{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify(string message);
}

ConcreteObserverクラスを定義します。これは、IObserverインターフェースを実装し、Updateメソッドを実装しています

public class ConcreteObserver : IObserver
{
    public void Update(string message)
    {
        Console.WriteLine("Observer Received: " + message);
    }
}

ConcreteObserverクラスを定義します。これは、IObserverインターフェースを実装し、Updateメソッドを実装しています

public class ConcreteSubject : ISubject
{
    private List<IObserver> _observers = new List<IObserver>();

    public void Attach(IObserver observer)
    {
        _observers.Add(observer);
    }

    public void Detach(IObserver observer)
    {
        _observers.Remove(observer);
    }

    public void Notify(string message)
    {
        foreach (var observer in _observers)
        {
            observer.Update(message);
        }
    }
}

Runメソッドで、ConcreteSubjectクラスのインスタンスを作成し、ConcreteObserverクラスのインスタンスをアタッチし、Notifyメソッドを呼び出します

public class Controller
{
    ConcreteSubject subject;
    ConcreteObserver observer1;
    ConcreteObserver observer2;

    public void Run()
    {
        subject = new ConcreteSubject();
        observer1 = new ConcreteObserver();
        observer2 = new ConcreteObserver();

        subject.Attach(observer1);
        subject.Attach(observer2);

        subject.Notify("Hello World!");

        Console.ReadKey();
    }
}

プログラム開始のため、次のコードを追加します(トップレベルステートメントを想定しています)
Mainメソッドに相当します

new Controller().Run();

どうでしょうか。上記のサンプルコードでは、ConcreteSubjectクラスがサブジェクト、ConcreteObserverクラスがオブザーバーを表しています。ConcreteSubjectクラスは、アタッチされたオブザーバーに対して、Notifyメソッドを呼び出すことで、状態の変化を通知しています。ConcreteObserverクラスは、Updateメソッドを実装して、サブジェクトから受け取った通知を処理します

クラス図