ヘッドファーストデザインパターン - オブザーバーモード

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を($ "天气预报布告板:{温度}、{湿度}、{}圧力")。
        } 
    }

テスト結果:

おすすめ

転載: www.cnblogs.com/SunSpring/p/11717399.html