1、気象監視アプリケーション、エラーデモ
温度検出手段、湿度感知手段、圧力感知手段:気象観測所があり、3つの手段があります。WeathData気象オブジェクト追跡データ、そこWeathData MeasurmentsChanged()メソッド、データ変化検出装置がMeasurmentsChanged呼び出された後。現在、需要は掲示板、つまり気象データのステータス(CurrentConditionDisply)、気象統計(StaisticsDisply)、天気予報(ForcastDisply)へ3は種々のデータを表示するために使用されます。この要求によると、私たちは以下の設計することができます
パブリッククラスWeatherData(){ プライベートフロート温度取得または設定;} プライベートフロート湿度{得る;セット;} プライベートフロート圧力{取得または設定し} 公共ボイドMeasurmentsChanged(){ CurrentConditionDisply.Update(温度、湿度、圧力) StaisticsDisply.Update(温度、湿度、圧力) ForcastDisply.Update(温度、湿度、圧力) } } publicクラスCurrentConditionDisply { 公共ボイド更新(フロート温度、フロート湿度、フロート圧力){ //更新公布数据 } } publicクラスStaisticsDisply { 公共ボイド更新(フロート温度、フロート湿度、フロート圧力){ //更新统计数据 } } publicクラスForcastDisply { 更新パブリック(フロート温度、湿度フロート、フロート圧力)を無効{ //天気予報を更新します } }
上記の設計によると、現在の需要を実現するが、新しい掲示板の追加や掲示板を削除した場合、我々は変更にMeasurmentsChanged方法を模索する必要がありますすることができます。
によって引き起こされる問題のこの例:
1、我々はインターフェイスのために戦うのではなく、プログラミングの実現のためのものです。
2は、それぞれの新しい掲示板のために、私たちは、コードを変更する必要がありました。
図3は、動的操作で掲示板を追加または削除することはできません。
カプセル化されていない部分の違反を変更する4は、オープン拡張、変更のため閉鎖しました。
2、オブザーバーパターンデカップルの使用
Observerパターン:オブジェクトが変更されたときに、彼の上のすべての依存が通知され、自動的に更新されます、オブジェクト間の多くの依存を定義します。
新聞を購読する新しい新聞を送信するために新しい新聞、新聞の読者は新聞の手に加入するために送られる際に押して、つまり、加入者のオブザーバー(観察)、テーマ(主題)で、典型的なオブザーバーモードであります。サブスクリプションモデルは、ここではクラス図に与えられ、その後、私たちは前にオブザーバーのためのカプセル化モードにステーションを乗り切ります。
図3に示すように、改良された気象パターンを使用して観察
観察者と改善された気象パターンに従って設計及びコードをテスト
/// <要約> ///主题 /// </要約> パブリックインターフェイス件名 { 公共ボイドRegisterObserver(観察者O)。 公共ボイドRemoveObserver(オブザーバー0); 公共ボイドNotifyObserver(); } /// <要約> ///具体主题(气象站) /// </要約> パブリッククラスWeatherData:件名 { プライベートリスト<オブザーバー>オブザーバー。 プライベートフロート温度{取得します。セットする; } プライベートフロート湿度{取得します。セットする; } プライベートフロート圧力{得ます。セットする; } パブリックWeatherData() { オブザーバー=新しいリスト<オブザーバー>(); } 公共ボイドRegisterObserver(観察者O) { observers.Add(O) } 公共ボイドRemoveObserver(観察者O) { observers.Remove(O) } //通知观察者 公共ボイドNotifyObserver() { foreachの(観察者にVAR 0) { o.Update(温度、湿度、圧力) } } 公共ボイドMeasurmentsChanged() { NotifyObserver()。 } //数据变化 公共CurrentConditionDisply(件名weatherData) 公共ボイドSetMeasurments(フロート温度、フロート湿度、フロート圧力) { 温度=温度。 湿度=湿度; 圧力=圧力; MeasurmentsChanged(); } } /// <要約> ///订阅者 /// </要約> パブリックインターフェイスオブザーバ { ボイド更新(フロート温度、フロート湿度、フロート圧力)。 } publicクラスCurrentConditionDisply:オブザーバー { プライベート件名weatherData。 { this.weatherData = weatherData。 weatherData.RegisterObserver(この); } 公共ボイド更新(フロート温度、フロート湿度、フロート圧力) { Console.WriteLineを($ "当前情况布告板:{温度}、{湿度}、{}圧力")。 } } publicクラスStaisticsDisply:オブザーバー { プライベート件名weatherData。 公共StaisticsDisply(被写体weatherData) { this.weatherData = weatherData。 weatherData.RegisterObserver(この); } 公共ボイド更新(フロート温度、フロート湿度、フロート圧力) { Console.WriteLineを($ "统计数据布告板:{温度}、{湿度}、{}圧力")。 } } publicクラスForcastDisply:オブザーバー { プライベート件名weatherData。 公共ForcastDisply(被写体weatherData) { this.weatherData = weatherData。 weatherData.RegisterObserver(この); } 公共ボイド更新(フロート温度、フロート湿度、フロート圧力) { Console.WriteLineを($ "天气预报布告板:{温度}、{湿度}、{}圧力")。 } }
テスト結果: