1. JDK中实现观察者模式通过Observale类(顾名思义可以被观察)与Observer接口(观察者),被观察者继承Observale类,观察者实现Observer接口,类图如下:
2.Observale类是线程安全的,通过Vector存储所有的观察者。同步方法实现观察者的添加、删除、被观察者的状态改变。
如:
public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!obs.contains(o)) { //调用Vector 的contains方法判断是否包含某个Observer对象,当且仅当 equals 方法为两个观察者返回 true 时 obs.addElement(o); }}
public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); //通知多个观察者,执行观察方法。 }
3.代码示例,假设论坛在发表帖子后,需要给订阅帖子用户发送链接。
提交帖子:
package design; import java.util.Observable; public class Topic extends Observable { public String submitTopic(String topic){ this.setChanged();//开启观察 this.notifyObservers(topic);//通知观察者 System.out.println("提交帖子:"+topic); return topic == null ? "null":topic; } }观察者发送邮件:
package design; import java.util.Observable; import java.util.Observer; public class TopicObserver implements Observer { @Override public void update(Observable o, Object arg) { submitTopicLog(arg.toString()); } public void submitTopicLog(String str){ System.out.println("发送邮件:"+str); } }调用:
package design; public class forkObserver { public static void main(String[] args) { Topic t = new Topic(); TopicObserver to = new TopicObserver(); t.addObserver(to); //注册观察者 System.out.println(t.countObservers()); t.submitTopic("hello, every one!!!"); } }4.系统中可能需要在方法执行前、执行后进行跟踪反馈,