java设计模式-Head First设计模式之观察者模式

来源:互联网 发布:淘宝商品资质图 编辑:程序博客网 时间:2024/06/02 21:02

Head First设计模式之观察者模式



定义


观察者模式-在对象之间定义的一对多依赖,这样依赖,当一个状态改变状态,依赖它的对象都会收到通知,并自动更新

要点


1 观察者模式定义了对象之间的一对多关系
2 主题(也就是观察者)用一个共同的接口来更新观察者
3 观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者的接口
4 有多个观察者时,不可以依赖特定的顺序通知次序
5 java有多中观察者模式的实现,包括了通用的 java.util.Observable
6 此模式被应用在许多地方,比如JavaBeans、RMI

3 新增原则

1 为交互对象之间的松耦合设计而努力 

4 代码实例


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

package Observer;public interface Subject {        public void registerObserver(Observer o);      public void removeObserver(Observer o);      public void notifyObserver();  }  


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

package Observer;public class CurrentDisplay implements Observer,DisplayElement{     private float temperature;     private float humidity;     private Subject weatherDate;          public CurrentDisplay(Subject weatherDate)     {         this.weatherDate=weatherDate;         weatherDate.registerObserver(this);     }     public void update(float temperature,float humidity,float pressure)     {         this.temperature=temperature;         this.humidity=humidity;         display();     }     public void display()     {         System.out.println("目前状况是温度:"+temperature+"度     "+"湿度:"+humidity+"%");     }  } 

package Observer;import java.util.ArrayList;  public class WeatherData implements Subject {        private ArrayList observers;      private float temperature;      private float pressure;      private float humidity;        public WeatherData() {          observers = new ArrayList();  //加上一个ArrayList来记录观察者,此ArrayList是在构造器中产生的      }        public void registerObserver(Observer o) {          observers.add(o);                    //有观察者注册时,将其加到ArrayList后面      }        public void removeObserver(Observer o) {          int i = observers.indexOf(o);       //观察者取消注册时,将其从ArrayList中删除          if (i >= 0) {              observers.remove(i);          }      }        public void notifyObserver() {          for (int i = 0; i < observers.size(); i++) {            //通知每一位观察者              Observer observer = (Observer) observers.get(i);              observer.update(temperature, humidity, pressure);          }      }        public void measurementsChanged() {          notifyObserver();      }        public void setMeasurements(float temperature, float humidity,              float pressure) {          this.temperature = temperature;          this.humidity = humidity;          this.pressure = pressure;          measurementsChanged();      }    }  

package Observer;public class WeatherStation {          public static void main(String[] args)      {         WeatherData weatherData=new WeatherData();   //建立一个WeatherData对象         CurrentDisplay currentDisplay=new CurrentDisplay(weatherData);  //建立布告板,并把WeatherData传给它们                   weatherData.setMeasurements(80, 65, 30.4f);  //模拟新的气象测量         weatherData.setMeasurements(82, 70, 29.2f);         weatherData.setMeasurements(78, 90, 29.2f);      }  }




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在考试中心补不了四级成绩怎么办 微信登录密码不记得了怎么办 欠农民工工资不给怎么办老板说没钱 国外期刊催问稿件不理睬怎么办 老公离不开老婆也离不开小三怎么办 出轨被老婆发现还和小三联系怎么办 老公出轨后回家老婆不想原谅怎么办 小三和原配打架都住院了怎么办 毕业太多年查不到学历认证怎么办 没有做税种核定开了票怎么办 在学信网上查不到学历信息怎么办 学信网手机号换了密码忘了怎么办 学信网手机号换了密码也忘了怎么办 学信网上学习形式是星号怎么办 新手机号已被注册微店买家怎么办 微信号被冻结了里面的钱怎么办 不懂公司产品却要接待老外怎么办 上菜时发现桌面摆不下新菜怎么办 超市买到过期产品商家不赔尝怎么办 皇帝成长计划2俘虏的士兵怎么办 晚上楼上有挪桌子的声音怎么办 金灶茶具出故障码e7怎么办 起亚k2灯泡掉进大灯总成怎么办 衣服上拆过线的针孔怎么办 驾考科目二坡道定点熄火怎么办 穿着超短裤感觉要漏屁股怎么办 台式电脑开机后无法进入系统怎么办 产后两年了肚子肥胖松弛怎么办 在作文中写上自己的名字怎么办 外出玩耍时迷路了你会怎么办 外出玩耍时孩子总喜欢乱跑怎么办? 如果真的物价高的受不了怎么办 每晚要5次真的受不了怎么办 五年级的学生钢笔字写不好怎么办 全麻醉药过后让人产生幻觉怎么办? 网贷小象优品上被别人冒用了怎么办 当你和老人产生冲突时该怎么办 百度网盘会员到期后容量怎么办 一个人不停的给你发视频聊天怎么办 被谋杀后的身后事应该怎么办 社保交了五年被单位辞退怎么办