この記事では、気象局の高温警告機能を実装するためのオブザーバーモードの使用について説明します。次のように、参照のために共有してください。
1。パターン定義
オブザーバーモード、パブリッシュ/サブスクライブモードとも呼ばれます。オブザーバーパターンは、オブジェクト間の1対多くの依存関係を定義します。オブジェクトの状態が変更されると、それに依存するすべてのオブジェクトは通知され、自動的に更新されます。
2。モデルの例
1パターン分析
このモデルを説明するために、気象局の高温警告を借ります。
2オブザーバーパターン静的クラス図
3つのコードの例
3.1 Observer Interface-Iobserver
パッケージcom.demo.observer; import com.demo.subject.isubject;/** * Observer interface * @author * */public interface iobserver {//更新メソッドpublic void update(isubject subject);}3.2トピックインターフェイスisubject
パッケージcom.demo.subject; import com.demo.observer.iobserver;/** *トピックインターフェイス(オブザーバー) * * @author * */public interface isubject {/** * add observer * * @param observer * @return */public boolean add(iobserver observer); / ** * delete observer * * @param observer * @return */ public boolean remove(iobserver observer); / ***すべてのオブザーバーにデータを更新するように通知*/ public void notifyAllobserver(); / ** *温度値を設定 * * @param温度 */ public void setemperature(float heeps); / ** *温度警告を取得 * * @return */ public string grematureReport();}3.3特定のトピックにおける主題の実装
パッケージcom.demo.subject; import java.util.iterator; import java.util.vector; import com.demo.observer.iobserver;/** *テーマ実装クラス(オブザーバー) * * * */パブリッククラスの主題isubject {//温度/** *(i)高温の指標 *日。 * *(2)高温オレンジ色の警告信号 * *標準:最高温度は24時間以内に37°を超えて上昇します。 * *(iii)高温の赤い警告信号 * *標準:最高温度は24時間以内に40°を超えるまで上昇します。 */プライベートフロート温度; //早期警告レベルのprivate string warninglevel; //オブザーバーリストを保存プライベートファイナルベクトル<IOBSERVER> VECTOR; / *** construmtメソッドオブザーバーリストを初期化します} / *** add observer* / public boolean add(iobserver observer){if(observer!= null &&!vector.contains(observer)){return vector.add(observer); } falseを返します。 } / ***オブザーバーを削除* / public boolean remove(iobserver observer){return vector.remove(observer); } / ***すべてのオブザーバーにデータを更新するように通知* / public void notifyAllobserver(){system.out.println( "=================================== (iterator.hasnext()){(iterator.next())。update(this)} / *** privateメソッドは温度値に従って警告レベルを設定し、すべてのオブザーバーに通知し、private void invoke(){if(this.temperature> = 35){if(thisteperature> = 35 && templeate 「黄色」(this.temperature> this.temperature <40){orange> = 40) */ public settemperature(float温度){this.temperation = this.invoke();3.4パーソナルオブザーバーパーソンオーバーサーバー
パッケージcom.demo.observer; import com.demo.subject.isubject;/** *個々のユーザーオブザーバー * @author * */public class personobserver imeobserver {public void update(isubject upducts){system.out.println( "個人は高温警告を受け取る: }}3.5政府のオブザーバー - 政府機関
パッケージcom.demo.observer; import com.demo.subject.isubject;/** *政府ユーザーオブザーバー * @author * * */public class governmentobserver Implesement ebresement Iobserver {public void update(isubject subject){system.out.println( "政府部門は高温警告を受け取りました。 }}3.6 CompanyObserver
パッケージcom.demo.observer; Import com.demo.subject.isubject;/** * Enterprise and Institutionsユーザーオブザーバー * @author * * */public class companyobserverはiobserver {public void update(isubject experce){system.out.out.println( "Enterprises and Institutions emponisutions and Institutions empertutions:); }}3.7システムがクライアントの実行を開始します
パッケージcom.demo; import java.util.random; import com.demo.observer.companyobserver; Import com.demo.observer.governmentobserver; Import com.demo.observer; import com.demo.subject;/** subject; @author * */public class client {/** * @param args */public static void main(string [] args){//トピックオブジェクトisubject subject = new subject(); //エンタープライズと機関の件名のオブザーバーを追加する件名(new companyobserver()); //政府のユーザーsubject.addのオブザーバーを追加する(new GovernmentObserver()); //個々のユーザーsubject.add(new Personobserver())のオブザーバーを追加します。 RANDOM RANDOM = new Random(); int i = 0; while(++ i <10){//ランダム温度subject.settemperature(random.nextint(45)); }}}4ランニング結果
========気象部門は黄色の高温アラームを発行します!======
企業と機関は高温の警告を受け取ります:温度:35.0
政府部門は高温警告を受け取りました:温度:35.0
個人は高温警告を受け取ります:温度:35.0
========気象部門は、高温のために赤いアラームを発行します!======
企業と機関は高温警告を受け取ります:温度:43.0
政府部門は高温警告を受け取りました:温度:43.0
個人は高温警告を受け取ります:温度:43.0
========気象部門は高温のオレンジ色のアラームを発行します!======
企業と機関は高温警告を受け取ります:温度:37.0
政府部門は高温警告を受け取りました:温度:37.0
個人は高温警告を受け取ります:温度:37.0
3。このモデルの設計原則
1「オープンクローズ」原理
2単一責任の原則
3。依存関係の反転の原則
4.機会を使用します
1抽象モデルには2つの側面があり、そのうちの1つは他方に依存し、独立したオブジェクトにカプセル化され、独立して変更され、互いに多重化される必要があります。
2システム内のオブジェクトを変更すると、他のオブジェクトのコンテンツを同時に変更する必要があるが、変更するオブジェクトの数がわからない場合。
3対応する変更を行うためにオブジェクトの変更を通知する必要があるが、オブジェクトに誰に通知されるかを判断することはできません。
5。「データのプル」静的クラス図
いわゆる「プッシュデータ」とは、観測されたオブジェクトが変更されると、関連するデータがパラメーターを介してオブザーバーに渡されることを意味し、オブザーバーが「データをプッシュする」をオブザーバーに形成します。静的クラス図は次のとおりです。
6。「データのプル」静的クラス図
いわゆる「プルデータ」、オブザーバーオブジェクトには、観測されているオブジェクトのインスタンスへの参照が含まれています。観察されているオブジェクトが変更されると、データはオブザーバーに渡されません。オブザーバーは、観測されているオブジェクトの参照に基づいて、関連するデータを積極的に取得します。これにより、観察者は観察されているオブジェクトから積極的に「データを引く」ことができます。静的クラス図は次のとおりです。
Java関連のコンテンツを増やすために、このサイトに興味のある読者は、「Javaオブジェクト指向プログラミングに関する紹介と高度なチュートリアル」、「Javaデータ構造とアルゴリズムに関するチュートリアル」、Java Operation domノードスキルの要約」、「Javaファイルの概要、およびJava操作スキルの概要」の概要を見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。