利用Java提供的观察者实现
java.utill包:Observable类。
接口:Observer update方法。
Java实现与自己实现的对比。
四点:
第一:不需要再定义观察者和目标的接口,JDK帮忙定义。
第二:具体的目标实现不需要维护观察者的注册信息了,这个Java中Observable类里面以及帮忙实现好了。
第三:触发通知的方式有一点变化,需要先调用setChanged方法,这个是Java为了帮助实现更精确的触发控制而提供的功能。
第四:具体观察者的实现里面,update方法其实能同时支持推模型和拉模型,这个在Java定义的时候,以及考虑进去了。
利用Java提供的观察者实现:
第一步:创建具体实现类,继承观察类
注意:在通知之前,在用java中的observer模式的时候,下面这句话不可少。
通知调用this.notifyObservers,如果是推的,需要传入参数,如果是拉的,不需要传参数。
package com.WeatherJavaObserverPattern; import java.util.Observable; //天气目标的具体实现类 public class ConcreteWeatherSubject extends Observable { //天气情况的内容 private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; //天气情况有了,就要通知所有的观察者 //注意:在通知之前,在用java中的observer模式的时候,下面这句话不可少 this.setChanged(); //然后主动通知,这里先用推的方式 this.notifyObservers(content); //如果是拉的方式,我们用 //this.notifyObservers(); } }
第二步:创建观察者对象。
注意:重写update方法。
package com.WeatherJavaObserverPattern; import java.util.Observable; import java.util.Observer; //具体的观察者对象 public class ConcreteObserver implements Observer { //观察者名称的变量 private String observerName; public String getObserverName() { return observerName; } public void setObserverName(String observerName) { this.observerName = observerName; } @Override public void update(Observable o, Object arg) { //第一种是推的方式 System.out.println(observerName+"手动的消息,目标推送过来的是"+arg); //第二种是拉的方式 //System.out.println(observerName+"手动的消息,主动到目标对象中去拉,拉的内容是"+ // ((ConcreteWeatherSubject)o).getContent()); } }
测试:
package com.WeatherJavaObserverPattern; //测试类 public class Client { public static void main(String[] args) { //创建天气作为一个目标,也可以说是被观察患者 ConcreteWeatherSubject subject=new ConcreteWeatherSubject(); //创建黄明的女朋友作为观察者 ConcreteObserver girl=new ConcreteObserver(); girl.setObserverName("黄明女朋友"); //创建黄明的老妈作为观察者 ConcreteObserver Mum=new ConcreteObserver(); Mum.setObserverName("黄明老妈"); //注册观察者 subject.addObserver(girl); subject.addObserver(Mum); //目标更新天气情况 subject.setContent("天气晴,气温28度"); } }