观察者模式
一、模式提出
定义一种一对多的依赖关系,让多个观察者对象同时监听每一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使得他们能够自动更新自己
二、业务逻辑
在北京奋斗8年的一个小伙,天天关注北京的房价,但是每天看房价都在不停的上涨,他非常的担心。。。
三、UML图
四、代码详解
注意:Observer接口,Observable是java.util包里,详细的源码请看源代码,这里只讲核心的几个方法
Observer接口
public interface Observer { /** * This method is called whenever the observed object is changed. An * application calls an Observable object's * notifyObservers method to have all the object's * observers notified of the change. * * @param o the observable object. * @param arg an argument passed to the notifyObservers
* method. */ void update(Observable o, Object arg); }
Obserable类只讲核心的方法
/** * Marks this <tt>Observable</tt> object as having been changed; the * <tt>hasChanged</tt> method will now return <tt>true</tt>. */ protected synchronized void setChanged() { changed = true; } /** * Adds an observer to the set of observers for this object, provided * that it is not the same as some observer already in the set. * The order in which notifications will be delivered to multiple * observers is not specified. See the class comment. * * @param o an observer to be added. * @throws NullPointerException if the parameter o is null. */ public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!obs.contains(o)) { obs.addElement(o); } } /** * If this object has changed, as indicated by the * <code>hasChanged</code> method, then notify all of its observers * and then call the <code>clearChanged</code> method to indicate * that this object has no longer changed. * <p> * Each observer has its <code>update</code> method called with two * arguments: this observable object and the <code>arg</code> argument. * * @param arg any object. * @see java.util.Observable#clearChanged() * @see java.util.Observable#hasChanged() * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ public void notifyObservers(Object arg) { /* * a temporary array buffer, used as a snapshot of the state of * current Observers. */ Object[] arrLocal; synchronized (this) { /* We don't want the Observer doing callbacks into * arbitrary code while holding its own Monitor. * The code where we extract each Observable from * the Vector and store the state of the Observer * needs synchronization, but notifying observers * does not (should not). The worst result of any * potential race-condition here is that: * 1) a newly-added Observer will miss a * notification in progress * 2) a recently unregistered Observer will be * wrongly notified when it doesn't care */ if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); }
Person关注房价的人
package cn.com.obersver.demo;
import java.util.Observable;
import java.util.Observer;
public class Person implements Observer {
public void update(Observable o, Object arg) {
System.out.println(o+"被观察的操作有所更改"+arg);
}
}
House房价变化啊,这年头学历高的毕业也头疼
package cn.com.obersver.demo;
import java.util.Observable;
public class House extends Observable {
private float price;//房子的商品价格
public House(float price) {
this.price = price;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
super.setChanged();//同事父类商品价格要发生改变,使得changed = true
this.price = price;
super.notifyObservers(price);//通知父类这是一个代理类,执行update方法
}
@Override
public String toString() {
return "房价";
}
}
注释:研究javaAPI是一件很有趣的事情,希望各位网友把自己研究的源码,展示出来