觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化,會通知所有觀察者對象,使他們能自動更新自己
import java.util.Observable;
public class House extends Observable {
private int price = 1000000;
public void modifyRoomRate(int price) {
this.price += price;
super.setChanged();
notifyObservers(this.price);
}
}
import java.util.Observable;
import java.util.Observer;
public class Buyer1 implements Observer {
public void update(Observable paramObservable, Object paramObject) {
System.out.println(paramObservable.countObservers()+"你好現在房價調整爲 :" + paramObject);
}
}
import java.util.Observable;
import java.util.Observer;
public class Buyer2 implements Observer {
public void update(Observable paramObservable, Object paramObject) {
System.out.println(paramObservable.countObservers()+"你好現在房價調整爲 :" + paramObject);
}
}
public class Client {
public static void main(String[] args) {
//被觀察者
House house = new House();
//觀察者
Buyer1 buyer1 = new Buyer1();
//觀察者
Buyer2 buyer2 = new Buyer2();
house.addObserver(buyer1);
house.addObserver(buyer2);
house.modifyRoomRate(2000);
}
}
Observable源代碼:
package java.util;
public class Observable
{
private boolean changed = false;
private Vector obs = new Vector();
public synchronized void addObserver(Observer paramObserver)
{
if (paramObserver == null)
throw new NullPointerException();
if (this.obs.contains(paramObserver))
return;
this.obs.addElement(paramObserver);
}
public synchronized void deleteObserver(Observer paramObserver)
{
this.obs.removeElement(paramObserver);
}
public void notifyObservers()
{
notifyObservers(null);
}
public void notifyObservers(Object paramObject)
{
Object[] arrayOfObject;
synchronized (this)
{
if (!(this.changed))
return;
arrayOfObject = this.obs.toArray();
clearChanged();
}
for (int i = arrayOfObject.length - 1; i >= 0; --i)
((Observer)arrayOfObject[i]).update(this, paramObject);
}
public synchronized void deleteObservers()
{
this.obs.removeAllElements();
}
protected synchronized void setChanged()
{
this.changed = true;
}
protected synchronized void clearChanged()
{
this.changed = false;
}
public synchronized boolean hasChanged()
{
return this.changed;
}
public synchronized int countObservers()
{
return this.obs.size();
}
}
Observer 源代碼:
package java.util;
public abstract interface Observer
{
public abstract void update(Observable paramObservable, Object paramObject);
}