簡單地說
觀察者模式的結構
觀察者(Observer)模式是對象的行為型模式
本模式的類圖結構如下

圖
在觀察者模式裡有如下的角色

圖

圖

圖
.具體觀察者(ConcreteObserver)角色

圖
下面給出一個示意性實現的Java代碼
public interface Subject
{
public void attach(Observer observer);
public void detach(Observer observer);
void notifyObservers();
}
代碼清單
這個抽象主題接口規定出三個子類必須實現的操作
具體主題則是實現了抽象主題Subject接口的一個具體類
import java
import java
public class ConcreteSubject implements Subject
public void attach(Observer observer)
{
observersVector
}
public void detach(Observer observer)
{
observersVector
}
public void notifyObservers()
{
Enumeration enumeration = observers();
while (enumeration
{
((Observer)enumeration
}
}
public Enumeration observers()
{
return ((Vector) observersVector
}
private Vector observersVector = new java
}
代碼清單
抽象觀察者角色的實現實際上是最為簡單的一個
public interface Observer
{
void update();
}
代碼清單
具體觀察者角色的實現其實只涉及update()方法的實現
public class ConcreteObserver implements Observer
{
public void update()
{
// Write your code here
}
}
代碼清單
雖然觀察者模式的實現方法可以有設計師自己確定
Java語言提供的對觀察者模式的支持
在Java語言的java
Observer接口
這個接口只定義了一個方法

圖
package java
public interface Observer
{
/**
* 當被觀察的對象發生變化時
*/
void update(Observable o
}
代碼清單
Observable類
被觀察者類都是java
java

圖
被觀察者類Observable的源代碼
package java
public class Observable
{
private boolean changed = false;
private Vector obs;
/** 用
public Observable()
{
obs = new Vector();
}
/**
* 將一個觀察者加到觀察者列表上面
*/
public synchronized void addObserver(Observer o)
{
if (!ntains(o))
{
obs
}
}
/**
* 將一個觀察者對象從觀察者列表上刪除
*/
public synchronized void deleteObserver(Observer o)
{
obs
}
/**
* 相當於 notifyObservers(null)
*/
public void notifyObservers()
{
notifyObservers(null);
}
/**
* 如果本對象有變化(那時hasChanged 方法會返回true)
* 調用本方法通知所有登記在案的觀察者
* 傳入this和arg作為參量
*/
public void notifyObservers(Object arg)
{
/**
* 臨時存放當前的觀察者的狀態
*/
Object[] arrLocal;
synchronized (this)
{
if (!changed) return;
arrLocal = obs
clearChanged();
}
for (int i = arrLocal
((Observer)arrLocal[i])
}
/**
* 將觀察者列表清空
*/
public synchronized void deleteObservers()
{
obs
}
/**
* 將
*/
protected synchronized void setChanged()
{
changed = true;
}
/**
* 將
*/
protected synchronized void clearChanged()
{
changed = false;
}
/**
* 探測本對象是否已變化
*/
public synchronized boolean hasChanged()
{
return changed;
}
/**
* 返還被觀察對象(即此對象)的觀察者總數
*/
public synchronized int countObservers()
{
return obs
}
}
代碼清單
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27487.html