观察者模式
定义对象之间的一种一对多的依赖关系,使得每当一个对象的状态发生了改变时,其相关依赖的对象皆得到通知并自动更新。
使用场景
- 一个抽象模型又两个方面,其中一个方面依赖于另外一个方面.
- 一个对象的改变将导致一个或者多个其他对象发生改变.
- 需要在系统中创建一个触发链.
代码测试用例 一 :
Subject
public abstract class Subject {
//保存注册的观察者对象
private List<Observer> mObservers = new ArrayList<>();
//注册观察者对象
public void attach(Observer observer){
mObservers.add(observer);
System.out.println("Attached an observer");
}
//注销观察者模式
public void dettach(Observer observer){
mObservers.remove(observer);
}
//通知所有的观察者对象
public void notifyObservers(String newState){
for (Observer observer : mObservers) {
observer.uppdate(newState);
}
}
}
Observer
interface Observer {
public void uppdate(String newState);
}
ConcreteSubject
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void change(String newState) {
state = newState;
System.out.println("ConcreteSubject state: " + state);
notifyObservers(state);
}
}
ConcreteObserver
public class ConcreteObserver implements Observer {
private String observerState;
@Override
public void uppdate(String newState) {
observerState = newState;
System.out.println("ConcreteObserver: state " + observerState);
}
}
验证:
public static void main(String[] args) {
//创建目标对象
ConcreteSubject concreteSubject = new ConcreteSubject();
//创建观察者对象
ConcreteObserver observer = new ConcreteObserver();
//注册
concreteSubject.attach(observer);
//目标状态改变
concreteSubject.change("I change");
}
java自带也有类似的方式,原理相同,在util包下面,集合使用的时Vector,这样可以保证线程安全. 可以使用替代品CopyOnWriteArrayList类来时实现(推荐)
Android中的实际运用
- 回调模式(按钮监听事件)
- listview中的notifyDataChanged
网友评论