设计模式——观察者模式

来源:互联网 发布:淘宝充值可以代付吗 编辑:程序博客网 时间:2024/06/06 23:52

      一、定义

              一种一对多的依赖关系,让多个观察者对想同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察这对象,是它们能够自动更新自己。

     二、例子。

            气象台对天气实时监控,只要天气的温度湿度等等一有变化就公告栏就更新数据。

           UML图:

             

           代码:

            天气变化接口:          

public interface Subject(){public void registerObserver(Observer o);//添加公告栏public void removeObserver(Observer o);//取消公告栏public void notifyObservers();//通知公告栏更新}

            天气变化数据改变实现:

public class WeatherData implements Subject{private ArrayList observers;private float temperature;private float humidity;private float pressure;//公告栏的模版public WeatherData(){observers= new ArrayList();}      //添加公告栏public void registerOvserver(Observer o ){observers.add(o);}//移除公告栏public void removeObserver(Observer o){int i=observers.indexOf(o);if(i>=0){observers.remove(i);}}//通知公告栏更新的信息public notifyObservers(){for(int i=0;i<observers.size();i++){Observer observer=(Observer)observer.get(i);observer.update(temperature,humidity,pressure);}}        //公告栏更新public void measurementsChanged(){notifyObservers();}//获得信息public void setMeasurements(float temperature,float humidity,float pressure){this.temperature=temperature;this.humidity=humidity;this.pressure=pressure;measurementsChanged();}}

        公告栏更新接口:

        

public interface Observer(){public void update(float temp,float humidity,float pressure);}

公告栏显示接口:

public interface DisplayElement(){public void display();}


公告栏:

public class CurrentConditionsDisplay implements Observer,DisplayElements{private float temperature;private float humidity;private Subject weatherData;//公告栏构造函数public CurrentConditionsDisplay(Subject weatherData){this.weatherData=weatherData;weatherData.registerOvserver(this);}//公告栏更新数据public void update(float temperature,float humidity,float,float pressure){this.temperature=temperature;this.humidity=humidity;display();}public void display(){System.out.println("Current conditions:"+ temperature+"F degress and "+humidity+"% humidity");}}

客户端:

       

public class WeatherStation{public static void main(String[] args){WeatherData wetherData=new WeaterData();CurrentConditionsDisplay currentDisplay(weaterData);weaterData.setMeasurements(80,65,30.4f);}}





 综述:

       观察者模式让双方都依赖于接口(或抽象),而不是依赖与具体,从而是的各自的变化都不会影响另一边的变化。公告板样式,显示数据的变化不会影响天气数据的变化。

      

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 掉头发怎么办怎样能让头发变多 11个月的宝宝大便干燥怎么办 1岁宝宝又拉又吐怎么办 怀孕八个月了不想要了怎么办 奶水不够宝宝又不喝奶粉怎么办 手机恢复出厂设置密码忘了怎么办 5s锁屏密码忘了怎么办 深圳房子卖了户口没地方迁怎么办 宝马1系130i烧机怎么办 小孩流清鼻涕怎么办最简单方法 孕3个月胎盘低置怎么办 孩子判逆不听家长的话该怎么办 香港购物超5000被海关扣怎么办 浅色衣服被深色衣服染色了怎么办 金立手机微信不能发语音怎么办 吃鸡买的账号密码邮箱忘记了怎么办 氩弧焊枪管带里进水了怎么办 绝地求生穿头盔的时候连衣帽怎么办 开车不小心把光缆线给挂断了怎么办 脚刺到了生锈钢钉没打针怎么办 一加3t背壳螺丝掉了怎么办 30万美金美金中国被扣怎么办 电脑使用迅雷变的很卡怎么办 优盘拷贝过程中失去优盘路径怎么办 用百度云上传视频文件太慢了怎么办 网易云音乐云盘电脑上传很慢怎么办 路由器的宽带账号密码忘记了怎么办 蚂蚁邦路由器管理密码忘记了怎么办 红米2a刷机失败怎么办 小米手机开机图案锁忘记了怎么办 小米6进水无限闪屏开机重启怎么办 红米手机一直卡在开机画面怎么办 红米4卡在开机画面怎么办 红米手机一直在开机画面怎么办 红米手机一直跳开机画面怎么办 红米note3锁屏密码忘记怎么办 红米手机忘记锁屏密码怎么办 红米4锁屏密码忘了怎么办 红米note忘记锁屏密码怎么办 红米note2锁屏密码忘了怎么办 机打发票抬头名字少写一个字怎么办