本篇文章主要介绍了"java设计模式之观察者模式",主要涉及到方面的内容,对于Android开发感兴趣的同学可以参考一下:
java设计模式之观察者模式:* 本文内容来自:Android源码设计模式解析与实战观察者模式的定义:观察者模式(observer pattern)又称为发布-...
java设计模式之观察者模式:
* 本文内容来自:Android源码设计模式解析与实战
观察者模式的定义:
- 观察者模式(observer pattern)又称为发布-订阅模式(publish/subscribe pattern),定义对象间一对多的依赖关系,使得每当一个对象改变时,则其所有依赖的对象都会得到通知并被自动更新.既然是一对多的关系,说明唯一的是被观察者,而观察者则可以有多种.
观察者模式使用场景:
- 关联行为场景,关联行为是可拆分的,而不是”组合”关系
- 事件多级触发的场景
- 跨系统的消息交换场景,如消息队列,事件总线的处理机制
观察者模式的UML类图:

- Subject:抽象主题,也就是被观察者(Observable),抽象主题角色把所有观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象.
- ConcreteSubject: 具体主题,即具体的被观察者(ConcreateObsevable),在具体主题的内部状态改变时,给所有注册过的观察者发出通知.
- Obsever: 抽象观察者,定义一个更新的接口,使得在得到主题改变的更新通知时更新自己
- ConcreteObserver: 具体观察者,实现Observer接口,在得到通知时更新自己.
观察者实例的实现:
publicabstractclass Observable {
//最好使用线程安全的Vectorprivate List mObservers = new ArrayList<>();
publicvoidattach(Observer observer) {
if (!mObservers.contains(observer)) {
mObservers.add(observer);
}
}
publicvoiddetach(Observer observer) {
if (observer != null) {
mObservers.remove(observer);
}
}
publicvoidnotifyObservers(String newStates) {
for (Observer observer : mObservers) {
observer.update(newStates);
}
}
}
publicclassConcreteObservableextendsObservable {private String state;
public String getState() {
return state;
}
publicvoidchanged(String newState) {
state = newState;
Log.d("ConcreteObservable", "主题改变:" + state);
notifyObservers(state);
}
}
publicinterface Observer {
void update(String state);
}
publicclassConcreteObserverimplementsObserver {private String observerState;
@Overridepublicvoidupdate(String state) {
observerState = state;
Log.d("ConcreteObserver", "状态为:" + observerState);
}
}
publicclass Client {
publicstaticvoidmain(String[] args){
ConcreteObservable observable= new ConcreteObservable();
Observer observer= new ConcreteObserver();
observable.attach(observer);
observer.update("new state");
}
}
Android中观察者模式的编写: