利用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度"); } }
观察者优缺点
优点:
实现了观察者和目标之间的抽象耦合。
实现类动态联动。
支持广播通信。
确定:
可能引起无谓的操作(不一定每个用户都要执行update)。
何时使用观察者
建议在以下情况选用观察者模式
1,当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化。
2,如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变。
3,当一个对象必须通知其他的对象,但是你又希望这个对象和其他被通知的对象是松散耦合的。