Java中的观察者模式(Observer)

编程技术  /  houtizong 发布于 3年前   82
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( " 天气炎热 " );    } } 


[运行结果] [b][/b]
天气预报:------------近期天气变化:台风‘珍珠’逼近近期天气变化:大到暴雨近期天气变化:天气炎热 
下一篇:sql优化

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客