C# デザインパターン - 動作パターン オブザーバーパターン

意味:

パブリッシュ/サブスクライブ (Publish/Subscribe) パターンとも呼ばれ、1 対多の依存関係を定義し、複数のオブザーバー オブジェクトが特定のトピック オブジェクトを同時に監視できるようにします。このトピック オブジェクトは、状態が変化するとすべてのオブザーバー オブジェクトに通知し、オブザーバー オブジェクト自体を自動的に更新できるようにします。

オブザーバー パターンには次の役割があります。

  1. サブジェクト: 抽象サブジェクト (抽象オブザーバ)。抽象サブジェクトの役割は、すべてのオブザーバ オブジェクトをコレクションに保存します。各サブジェクトは任意の数のオブザーバを持つことができます。抽象サブジェクトは、オブザーバ オブジェクトを追加および削除するためのインターフェイスを提供します。
  2. ConcreteSubject: 特定のサブジェクト (特定のオブザーバー)。このロールは、関連するステータスを特定のオブザーバー オブジェクトに保存し、特定のサブジェクトの内部ステータスが変化したときに、登録されているすべてのオブザーバーに通知を送信します。
  3. オブザーバー: 抽象オブザーバーはオブザーバーの抽象クラスであり、トピックの変更が通知されたときに自身を更新できるように更新インターフェイスを定義します。
  4. ConcrereObserver: 抽象オブザーバーによって定義された更新インターフェイスを実装する具象オブザーバー。トピックの変更が通知されたときに自身のステータスを更新できるようにします。

場合

このケースでは、デリゲートを使用してマルチキャストを実行し、給湯器を監視します。

ヒーターの種類

最初にグローバル変数、温度を定義し、次に、event を使用してイベントを宣言します。デリゲート名には戻り値のない Action が使用され、パラメーターは int です。次に、沸騰したお湯をシミュレートする for ループを作成し、温度が 95 度を超えるとイベントが実行されます。

public class HeaterSubject
{
    private int _temperature;

    public event Action<int> OnBoilEvent;

    public void BoilWater()
    {
        for (int i = 0; i < 100; i++)
        {
            _temperature++;
            
            if (_temperature >= 95)
            {
                OnBoilEvent.Invoke(_temperature);//触发事件:发出警报,显示水温
            }
        }
    }
}

監視者

通常、給湯器には表示画面と警報器がありますが、ここでは表示器と警報器の 2 つの監視者をシミュレートします。

上記で宣言されたデリゲート パラメータは int であるため、ここでのオブザーバー パラメータも一致する必要があり、しばらくするとマルチキャストを通じて挿入できます。

public class DisPlayObserver
{
    /// <summary>
    /// 显示水温
    /// </summary>
    /// <param name="temperature"></param>
    public void Display(int temperature)
    {
        Console.WriteLine($"显示屏-当前温度是:{temperature}");
    }
}
public class AlertObserver
{
    /// <summary>
    /// 发出警报
    /// </summary>
    /// <param name="temperature"></param>
    public void MakeAlert(int temperature)
    {
        Console.WriteLine($"语音报警器-温度是{temperature}");
    }
}

メインメソッド

main メソッドでは、給湯器の新しいインスタンスを実装し、マルチキャストを使用して複数のメソッドをデリゲート インスタンスにバインドします。このようなデリゲートが呼び出されると、すべてのバインドされたメソッドが一度に呼び出され、最後に給湯器の沸騰メソッドが呼び出されます。

    public static void Main(string[] args)
    {
        HeaterSubject subject = new HeaterSubject();
        //订阅发出警报
        subject.OnBoilEvent += new AlertObserver().MakeAlert;
        //订阅显示水温
        subject.OnBoilEvent += new DisPlayObserver().Display;
        
        subject.BoilWater();
    }

 マルチキャストの長所と短所

  1. 利点: ターゲットとオブザーバーの間の結合関係が減少し、両者の間には抽象的な結合関係が存在します。監視者が通知を送信し、登録されているすべての監視者が情報を受信します [ブロードキャスト メカニズムを実装できます]
  2. 短所: オブザーバーが非常に多い場合、オブザーバーが送信した通知をすべてのオブザーバーが受信するのに時間がかかります。オブザーバーに循環依存関係がある場合、オブザーバーが送信した通知によってオブザーバーがループで呼び出され、システムを崩壊させる

 使用するシーン

  1. オブジェクト間には 1 対多の関係があり、1 つのオブジェクトの状態の変化は他のオブジェクトに影響を与えます。
  2. 抽象モデルに 2 つの側面があり、一方が他方に依存する場合。

 

おすすめ

転載: blog.csdn.net/weixin_65243968/article/details/132175126