本文爲第二屆 Google 暑期大學生博客分享大賽 - 2011 Android 成長篇參賽作品
觀察者模式的定義可以參見wiki中的資料,鏈接如下
http://zh.wikipedia.org/wiki/觀察者模式
其UML類圖如下
1.定義
觀察者模式(有時又被稱爲發佈/訂閱模式)是軟件設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實作事件處理系統。
2.參與observe模式的實現
2.1 目標類別
該類別可以提供一個接口讓觀察者進行添附與解附作業
此類別內有個不公開的觀察者串煉,並透過下列函式(方法)進行作業
- 添附(Attach):新增觀察者到串煉內,以追蹤目標物件的變化。
- 解附(Detach):將已經存在的觀察者從串煉中移除。
- 通知(Notify):利用觀察者所提供的更新函式來通知此目標已經產生變化。
具體實現可參考如下:
import java.util.ArrayList;
import java.util.Iterator;
/**
* An interface to represent the state of an observable Transaction.
*/
public abstract class Observable {
private final ArrayList<Observer> mObservers;
private Iterator<Observer> mIterator;
public Observable() {
mObservers = new ArrayList<Observer>();
}
/**
* This method is implemented by the observable to represent its
* current state.
*
* @return A TransactionState object.
*/
abstract public TransactionState getState();
/**
* Attach an observer to this object.
*
* @param observer The observer object to be attached to.
*/
public void attach(Observer observer) {
mObservers.add(observer);
}
/**
* Detach an observer from this object.
*
* @param observer The observer object to be detached from.
*/
public void detach(Observer observer) {
if (mIterator != null) {
mIterator.remove();
} else {
mObservers.remove(observer);
}
}
/**
* Notify all observers that a status change has occurred.
*/
public void notifyObservers() {
mIterator = mObservers.iterator();
try {
while (mIterator.hasNext()) {
mIterator.next().update(this);
}
} finally {
mIterator = null;
}
}
}
2.2抽象觀察者接口
抽象觀察者類別是一個必須被實做的抽象類別。這個類別定義了所有觀察者都擁有的更新用接口,此接口是用來接收目標類別所發出的更新通知。此類別含有以下函式
- 更新(Update):會被實做的一個抽象(虛擬)函式。
實現可參考如下
/**
* An interface for observing the state of a Transaction.
*/
public interface Observer {
/**
* Update the state of the observable.
*
* @param observable An observable object.
*/
void update(Observable observable);
}
3總結
android開發中很多地用到了觀察者模式,這個模式很好地幫助我們去更好的架構程序!例如Android中的message程序。