凡东 さんのプロフィール凡东的共享空间フォトブログつながり ツール ヘルプ

ブログ


    10月21日

    Java中的观察者模式(Observer)

    观察者模式理解为就是一个对象发生某种变化时,它的观察者做出相应的动作。观察者和被观察的对象之前建立关系。
     
    Java作为一种面向对象的开发语言,对实现设计模式提供了良好的支持,并且提供了许多默认的实现,比如:通过Java中的Observable类和Observer接口可以方便的实现观察者模式。

    下面我们就用一个实际的例子来说明:日常生活中说起观察者,最常见的例子可能就是天气预报,在这里我们的观察对象是地球,而我们是通过发射气象卫星这个观察者来检测地球气象变化的。

    所以这个例子中涉及三个对象:
    地球  (Earth):                                          被观察对象
    气象卫星(Satellite):                        观察者
    气象局(WeatherService):        客户端调用

    被观察对象:地球  (Earth)


     import    java.util.Observable;

     /**  */  /**  
     *  被观察对象:地球
     *  
     *    @author    zjun
     *    @version    1.0  create  on  2006-5-18  9:42:45
       */  
       public      class    Earth    extends    Observable      {
             private    String  weather    =      "  晴朗  "  ;

             /**  */  /**  
             *    @return    Returns  the  weather.
               */  
               public    String  getWeather()      {
                     return    weather;
           }  
     
               /**  */  /**  
             *    @param    weather
             *                        The  weather  to  set.
               */  
               public      void    setWeather(String  weather)      {
                     this  .weather    =    weather;
                     //    设置变化点  
                     setChanged();
                   notifyObservers(weather);
           }  
    }  
    [注意]  在需检测的对象前需要设置变化点setChanged()和通知观察者notifyObservers(),这两个函数是由Observable类实现的,封装了观察者模式实现的细节。

    观察者:气象卫星(Satellite)  

     import    java.util.Observable;
     import    java.util.Observer;

     /**  */  /**  
     *  观察对象:气象卫星
     *  
     *    @author    zjun
     *    @version    1.0  create  on  2006-5-18  9:46:30
       */  
       public      class    Satellite    implements    Observer      {
             private    String  weather;

             public      void    update(Observable  obj,  Object  arg)      {
                   weather    =    (String)  arg;
                     //    捕获天气变化情况,反馈给检测者  
                     System.out.println(  "  近期天气变化:  "      +    weather);
           }  
    }  
    客户端调用:气象局(WeatherService)  

       /**  */  /**  
     *  客户端调用:天气预报
     *  
     *    @author    zjun
     *    @version    1.0  create  on  2006-5-18  9:57:19
       */  
       public      class    WeatherService      {

             /**  */  /**  
             *    @param    args
               */  
               public      static      void    main(String[]  args)      {
                   Earth  earth    =      new    Earth();
                   
                   Satellite  satellite    =      new    Satellite();
                     //    发射气象卫星  
                     earth.addObserver(satellite);

                   System.out.println(  "  天气预报:  "  );
                   System.out.println(  "  ------------  "  );
                   earth.setWeather(  "  台风‘珍珠’逼近  "  );
                   earth.setWeather(  "  大到暴雨  "  );
                   earth.setWeather(  "  天气炎热  "  );
           }  
    }  
     
    [运行结果]  

     天气预报:
    ------------
    近期天气变化:台风‘珍珠’逼近
    近期天气变化:大到暴雨
    近期天气变化:天气炎热

    コメント

    しばらくお待ちください。
    入力されたコメントは長すぎます。短くしてください。
    何も入力されていません。もう一度やり直してください。
    現在、コメントを追加できません。後でもう一度やり直してください。
    コメントと書くには、保護者 (ほごしゃ) の方の許可 (きょか) をもらってください。許可をリクエストする
    保護者 (ほごしゃ) の方が、あなたがコメントを書けないようにしています。
    現在、コメントを削除できません。後でもう一度やり直してください。
    1 日に投稿できるコメントの最大数を超えました。24 時間経過してから、もう一度やり直してください。
    あなたが他のユーザーに対して迷惑行為を行っている可能性があると確認されたため、お使いのアカウントによるコメントの投稿を無効にしています。誤って無効にされたと思われる場合は、Windows Live のサポートにお問い合わせください。
    コメントを投稿する前に、以下のセキュリティ チェックを完了してください。
    セキュリティ チェックに入力する文字は、画像に表示されている文字または音声で流れた文字と一致していなければいけません。

    コメントを投稿するには、お使いの Windows Live ID でサインインしてください (Hotmail、Messenger、または Xbox LIVE を既に使用している場合は、そのアカウントが Windows Live ID です)。サインイン


    Windows Live ID をお持ちでない場合は、アカウントを新規登録してください。

    トラックバック

    この記事のトラックバックの URL は次のとおりです。
    http://mfdshare.spaces.live.com/blog/cns!9CFD52C9EF02AFB!178.trak
    この記事を参照しているブログ
    • なし