观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式又叫发布-订阅(Publish/Subscribe)模式。
总体步骤:
1.定义观察者接口
2.定义主题接口
3.实例化主题对象
4.主题对象添加观察者
5.主题变化后,调用其notifyObserver()方法,通知所有已经注册过的观察者对象。
6.观察者接收到通知后,做出相应处理。
接下来,使用代码进行逐一阐述
1.定义观察者接口
/**
* Observer(观察者 Observer):interface
* 为那些在主题发生改变时需要获得通知的对象定义一个更新接口。
*/
public interface Observer {
public void update();
}
2.定义主题接口
/*
* 被观察者interface
* 被观察者(Observable)可以有任意多个观察者(Observer)观察
* 提供注册和删除观察者对象的接口
* 当主题发生变更时,通知所有已经注册过的观察者对象
* */
public interface Observable {
//在其接口中定义一个用来注册观察者的方法
public void addObserver(Observer observer);
//再定义一个用来删除观察者的方法
public void removeObserver(Observer observer);
//再定义一个可以实现行为变现并向观察者传输信息的方法
public void notifyObserver();
}
3.实例化主题对象 & 4.主题对象添加观察者/*
* 被观察者实现类
* */
public class ConstructObservable implements Observable{
// 定义一个用于登记观察者(Observer)的List
private CopyOnWriteArrayList<WeakReference<Observer>> mObserverListeners = new CopyOnWriteArrayList<WeakReference<Observer>>();
@Override
public void addObserver(Observer observer) {
// TODO Auto-generated method stub
mObserverListeners.add(new WeakReference<Observer>(observer));
}
@Override
public void removeObserver(Observer observer) {
// TODO Auto-generated method stub
mObserverListeners.remove(observer);
}
public void removeAllObserver() {
// TODO Auto-generated method stub
for (WeakReference<Observer> listenerWeakReference : mObserverListeners) {
if (null != listenerWeakReference) {
mObserverListeners.remove(listenerWeakReference);
}
}
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for (WeakReference<Observer> listenerWeakReference : mObserverListeners) {
if (null != listenerWeakReference) {
Observer listener = listenerWeakReference.get();
listener.update();
}
}
}
}
步骤5 & 步骤6
public class ObserverTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int cnt = 10;
//实例化主题对象
ConstructObservable observable = new ConstructObservable();
//实例化观察者对象,并且注册
for (int i = 1; i < cnt; i++) {
ConstructObserver observer = new ConstructObserver("ConstructObserver id = " + i);
observable.addObserver(observer);
}
//通知观察者
observable.notifyObserver();
//remove
observable.removeAllObserver();
}
}