デザインパターン:Observerパターン(A)

  • Observerパターンは、一つのオブジェクトの状態が変化したときに、そのすべての扶養家族に通知し、自動的に更新されるように、観測者にますます頼る必要があるオブジェクト間のテーマを定義します。
  • 役割
    • テーマ(主題):テーマは、特定のトピックを達成するために必要なメソッドを定義するインターフェースであります
    • 観察者(観察):視聴者インターフェース、データの特定の視聴者を更新する方法を指定します。
    • 特定のトピック(ConcreteSubject) テーマ実施テーマ・インターフェース・クラスの特定のインスタンスは、インスタンスデータが頻繁に変更することができる含みます。データの変更、特定の観測者に通知するために、参照オブザーバを保存するために、ArrayListのような特定のトピックのセットを使用してください。
    • 詳細な観察者(観察者コンクリート):視聴者の特定のインスタンスは、視聴者インタフェースで実装します。具体的な観察者は、参照は、特定のオブザーバー特定のトピックは、特定のトピックのコレクションに自分自身を追加その観測者になるために、または彼らの特定から、この特定のトピックを作るようにするために、特定のテーマのテーマインタフェース変数に保存することができます含まれていオブザーバリストトピックは削除されますので、彼はもはやその視聴者ではなかったです。
  • 多くの関係
    • オブザーバーパターンを使用して、テーマオブジェクトは、状態を持っており、これらの状態を制御することができます。言い換えれば、テーマの状態で「A」があります。一方、これらのオブザーバー資格を使用し、これらの状態は、それらに属していないが。多くのオブザーバーは状態を変更するときにそれらを伝えるために、テーマを頼るがあります。「」テーマは、観察者の「複数」の関係に対応しています。これは、関係を作成します。
  • Demo背景 
    • 気象観測ステーションの設計は、などの温度、湿度、気圧を測定する、など看板温度、快適掲示板、掲示板、天気予報など様々な掲示板を持っています。気象データの変化は、データはこれらの看板に必要たびに自動的に更新されます。
  • コードの実装
    • インターフェーステーマ:ISubject
      パブリック インターフェースISubject 
      { 
          ボイドRegisterObserver(IObserver 0)。
          RemoveObserver(IObserver 0);
          NotifyObserver(); 
      }
    • オブザーバーインタフェース:IObserver
      パブリック インターフェイスIObserver 
      { 
          ボイド更新(フロート TEMP、フロート湿度、フロート圧力)。
      }
    • 特定のトピック:WeatherData
      パブリック クラスWeatherData:ISubject 
      { 
          プライベートのArrayListオブザーバー。
          プライベート フロート温度;
          プライベート フロート湿度;
          プライベート フロート圧力;
          パブリックWeatherData()
              { 
                  オブザーバー = 新しいArrayListを()。
              } 
          公共 ボイドRegisterObserver(IObserver 0)
          { 
              observers.Add(O)
          } 
      
          公共 ボイドRemoveObserver(IObserver 0)
          { 
              int型 I = observers.IndexOf(O)
              もし(I> = 0 
              { 
                  observers.RemoveAt(I)。
              } 
          } 
      
          公共 ボイドNotifyObserverを()
          { 
              ためint型 i = 0 ; I <observers.Count; I ++ 
              { 
                  IObserverオブザーバ = (IObserver)オブザーバー[I]。
                  observer.Update(温度、湿度、圧力)。
              } 
          } 
          公共 ボイドmessurementsChanged()
              { 
                  NotifyObserver()。
              } 
          パブリック 無効 SetMessureMents(フロート温度、フロート湿度、フロート圧力)
              { 
                  この .temperature = 温度。
                  この .humidity = 湿度;
                  この .pressure = 圧力; 
                  messurementsChanged(); 
              } 
      }

       

    • 具体的なオブザーバー:CurrentConditionDisplay、ForecastDisplay
      パブリック インターフェースIDisplayElement 
      { 
          ボイドディスプレイ(); 
      }
      パブリック クラスCurrentConditionDisplay:IObserver、IDisplayElement 
      { 
          プライベート フロート温度;
          プライベート フロート湿度;
          プライベート フロート圧力;
          プライベートISubject weatherData。
          公共 ボイドディスプレイ()
          { 
              Console.WriteLineを($ " 公告板1当前天气=>温度:{}温度、湿度:{}湿度、圧力:{圧力} " ); 
          } 
      
          公共 ボイド更新(フロート温度、フロート湿度、フロート圧力)
          {
              この .temperature = 温度。
              この .humidity = 湿度;
              この .pressure = 圧力; 
              表示(); 
          } 
          公共CurrentConditionDisplay(ISubject weatherData)
          { 
              この .weatherData = weatherData。
              weatherData.RegisterObserver(この); 
          } 
      }
      パブリック クラスForecastDisplay:IObserver、IDisplayElement 
      { 
          プライベート フロート温度;
          プライベート フロート湿度;
          プライベート フロート圧力;
          プライベートISubject weatherData。
          公共 ボイドディスプレイ()
          { 
              Console.WriteLineを($ " 公告板2明天天气=>温度:{}温度、湿度:{}湿度、圧力:{圧力} " ); 
          } 
      
          公共 ボイド更新(フロート温度、フロート湿度、フロート圧力)
          {
              この .temperature = 温度。
              この .humidity = 湿度;
              この .pressure = 圧力; 
              表示(); 
          } 
          公共ForecastDisplay(ISubject weatherData)
          { 
              この .weatherData = weatherData。
              weatherData.RegisterObserver(この); 
          } 
      }
    • テストコードと業績
      静的 ボイドメイン(文字列[]引数)
      { 
          WeatherData weatherData = 新しいWeatherData()。
          Console.WriteLineを(" --------公告板1加入观察者------- " )。
          CurrentConditionDisplay DISPLAY1 = 新しいCurrentConditionDisplay(weatherData)。
          weatherData.SetMessureMents(102030 )。
          Console.WriteLineを(" --------公告板2加入观察者------- " )。
          ForecastDisplayにてDisplay = 新しいForecastDisplay(weatherData)。 
          weatherData.SetMessureMents(152535 ); 
          Console.WriteLineを(" --------出口ビューア掲示板1 ------- " ); 
          weatherData.RemoveObserver(DISPLAY1); 
          weatherData.SetMessureMents(192939 ); 
      }
  • 長所
    • 特定のトピックや特定のオブザーバーは、疎結合されています。テーマ(主題)インターフェイスは、観察者のみ(オブザーバー)インターフェースに依存しているので、そうちょうどそれが特定のテーマの観察者のことを知っていることはオブザーバー(オブザーバー)インタフェースを実装するクラスのインスタンスですが、具体的にどのクラスを知る必要はありません。観察者が唯一のトピック(主題)インターフェースに依存するので、また、そうちょうどそれがクラスインターフェイスのテーマ(主題)のインスタンスを達成することである特定のオブザーバーをテーマに依存するが、具体的にどのクラスを知る必要がないことを知っています。
    • 満たすために、観察モード「オープン - は原則を閉じました。」新しい実現オブザーバ(オブザーバー)インタフェースを追加するので、もし私たちは、特定のテーマカテゴリを作成することがオブザーバー(オブザーバー)のインターフェイスにのみ依存して作ることができるようにテーマ(主題)インタフェースは、観察者のみ(オブザーバー)のインターフェースに依存しますクラス、クラスの特定のトピックを作成するためにコードを変更する必要はありません。また、唯一のトピック(オブザーバー)のインターフェースに依存し、具体的なオブザーバークラスを作成し、新しい実現のトピック(主題)クラスのインタフェースを追加する場合、具体的なオブザーバークラスを作成するためのコードを変更する必要はありません。
  • 送信元アドレス:https://github.com/DonyGu/DesignPatterns

おすすめ

転載: www.cnblogs.com/donyblog/p/11370690.html