一,观察者模式详解
-
概念
定义对象之间的一种一对多的依赖关系,使得每当一个对象状态改变,相关依赖的对象都会得到通知并被自动更新。 -
使用场景
(1)一个抽象模型,有两个方面,其中一个方面依赖另外一个方面。
(2)一个对象的改变,导致一个或多个对象发生改变
(3)需要在系统中创建一个触发链 - UML
- 代码示例
- 第一种写法
public interface Oberver {
void update(String newState);
}
public abstract class Subject {
//保存观察者对象
private List<Oberver> obervers = new ArrayList<>();
public void attach(Oberver oberver) {
obervers.add(oberver);
}
public void detach(Oberver oberver) {
obervers.remove(oberver);
}
//通知所有注册观察者对象
public void notifyObservers(String newState){
for (Oberver observer:obervers){
observer.update(newState);
}
}
}
public class ConcreteObserver implements Oberver {
private String observerState;
@Override
public void update(String newState) {
observerState=newState;
}
}
public class ConcreteSubject extends Subject{
private String state;
public String getState(){
return state;
}
public void change(String newState){
state=newState;
notifyObservers(state);
}
}
ConcreteSubject concreteSubject = new ConcreteSubject();
Oberver oberver = new ConcreteObserver();
concreteSubject.attach(oberver);
concreteSubject.change("I change");
- 第二种写法(java提供的类)
public class TargetObserver implements Observer {
private String name;//观察者名称
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
((TargetObservable) o).getNewState();
}
}
public class TargetObservable extends Observable {
private String newState;
public String getNewState() {
return newState;
}
public void setNewState(String newState) {
this.newState = newState;
this.setChanged();
this.notifyObservers(newState);
}
}
TargetObservable targetObservable=new TargetObservable();
TargetObserver targetObserver=new TargetObserver();
targetObservable.addObserver(targetObserver);
targetObservable.setNewState("hello");
···
TargetObservable targetObservable = new TargetObservable();
TargetObserver targetObserver = new TargetObserver();
targetObservable.addObserver(targetObserver);
targetObservable.setNewState("hello");
···
-
两种写法区别
(1)java中用的不是list而是Vector
原因是 线程安全
(2)Vector是否有替代品
有 CopyOnWriteArrayList也是线程安全的
二,android中的实际应用
-
回调模式
Button为被观察者,onClickListener为观察者
Listview中的notifyDataChanged
Rxjava中的观察者模式的运用