本文为第二届 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程序。