介绍
观察者模式(Observer Pattern)属于行为型模式。当对象间存在一对多关系时,一个对象被修改时,需要自动通知依赖它的对象。
优点
- 观察者和被观察者是抽象耦合的。
- 建立一套触发机制。
缺点
- 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
- 观察者和被观察者如果相互依赖的话,可能循环崩溃
应用
Android中的Lifecycles,消息处理机制、广播、set某listener
在日常开发中,回调的使用场景非常多,比如按钮的点击事件,网络的请求结果等等,它表示的是对某一将来可能发生事件的监听。如果对某一个事件有多个监听,就需要在事件触发者里创建监听者列表,然后在事件发生时挨个通知注册过的监听者。这就是“观察者模式”。
实现
关键代码:被观察者修改信息,自动通知观察者
import java.util.ArrayList;
import java.util.List;
class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private String state;
public String getState() {
return state;
}
public void changeState(String state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
abstract class Observer {
protected Subject subject;
public abstract void update();
}
class RealObserver extends Observer{
public RealObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "OBSERVER: Data is: " + subject.getState());
}
}
class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new RealObserver(subject);
subject.changeState("Hello!");
subject.changeState("Good afternoon");
}
}
OBSERVER: Data is: Hello!
OBSERVER: Data is: Good afternoon