观察者模式
一、定义
又叫发布-订阅模式;定义了对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。最为典型的例子:EventBus三方框架,主要用于Android的通信。
二、UML类图

从它的UML类图中可以看出,主要有四个角色:
- 发布者/被观察者(抽象):添加、移除、通知观察者的职责
- 订阅者/观察者(抽象):提供公共的更新方法
- 具体的被观察者
- 具体的观察者
三、观察者模式的简单实现
根据四个主要角色来进行划分:
- 被观察者Observable
...
public interface Observable {
/**
* 添加观察者
*
* @param observer Observer
*/
void register(Observer observer);
/**
* 移除观察者
*
* @param observer Observer
*/
void unregister(Observer observer);
/**
* 通知所有观察者
*/
void notifyAllObservers();
}
...
- 观察者Observer
...
public interface Observer {
/**
* 观察者通用更新方法
*
* @param newState 新状态值
*/
void update(String newState);
} ...
- 具体的被观察者ConcreteObservable
...
public final class ConcreteObservable implements Observable {
private List<Observer> mObservers = new ArrayList<>();
private String state;
public ConcreteObservable() {
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
notifyAllObservers();
}
@Override
public void register(Observer observer) {
if (mObservers == null) return;
mObservers.add(observer);
}
@Override
public void unregister(Observer observer) {
if (mObservers == null) return;
int index = mObservers.indexOf(observer);
if (index == -1) return;
mObservers.remove(observer);
}
@Override
public void notifyAllObservers() {
for (Observer observer : mObservers) {
observer.update(this.state);
}
}
}
...
- 具体观察者
...
public class ObserverA implements Observer {
public ObserverA(Observable observable) {
observable.add(this);
}
@Override
public void update(String newState) {
System.out.println(" ObserverA newState:" + newState);
display(newState);
}
private void display(String newState) {
System.out.println(" display:" + newState);
}
}
...
在Main方法中如何调用? ...
Observable observable = new ConcreteObservable();
Observer a = new ObserverA(observable);
Observer b = new ObserverB(observable);
((ConcreteObservable) observable).setState("true");
((ConcreteObservable) observable).setState("false");
...