理解
- 对象间的一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于他的对象得到通知并被自动更新
主要解决
- 一个对象状态改变给其他对象通知的问题,要考虑到易用和低耦合,保证高度的协作
如何解决
- 使用面向对象技术,弱化依赖
优点
- 观察者和被观察者是抽象耦合的
- 建立一套触发机制
缺点
- 如果一个被观察者对象有很多直接或间接的观察者,要全部都通知到,会花费很多的时间
- 如果在观察者和观察目标之间有循环依赖,观察目标会触发循环调用,可能导致系统崩溃
- 观察者模式没有相应的机制让观察者知道观察目标是怎么发生变化的,仅仅知道观察目标发生了变化
使用场景
- 有多个子类共有的方法,且逻辑相同
- 重要的、复杂的方法,可以考虑作为模板方法
注意事项
- Java中已经有了对观察者模式的支持类
- 避免循环引用
- 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式
第一步
- 创建Subject类(Subject.java)
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for(Observer observer : observers){
observer.update();
}
}
}
第二步
- 创建Observer类 (Observer.java)
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
第三步
- 创建实体观察者类
- FirstObserver.java、SecondObserver.java、ThirdObserver.java
public class FirstObserver extends Observer{
public FirstObserver (Subject subject) {
this.subject = subject;
}
@Override
public void update() {
System.out.println("First : " + subject.getState());
}
}
public class SecondObserver extends Observer{
public SecondObserver (Subject subject) {
this.subject = subject;
}
@Override
public void update() {
System.out.println("Second : " + subject.getState());
}
}
public class ThirdObserver extends Observer{
public ThirdObserver (Subject subject) {
this.subject = subject;
}
@Override
public void update() {
System.out.println("Third : " + subject.getState());
}
}
第四步
- 客户端调用(ObserverDemo.java)
public class ObserverDemo {
public static void main(String[] args) {
Subject subject = new Subject();
FirstObserver firstObserver = new FirstObserver(subject);
SecondObserver secondObserver = new SecondObserver(subject);
ThirdObserver thirdObserver = new ThirdObserver(subject);
subject.attach(firstObserver);
subject.attach(secondObserver);
subject.attach(thirdObserver);
System.out.println("First state change : 15");
subject.setState(15);
System.out.println("Second state change : 8");
subject.setState(8);
}
}
第五步
- 收获结果
First state change : 15
First : 15
Second : 15
Third : 15
Second state change : 8
First : 8
Second : 8
Third : 8
关注我的技术公众号,每个工作日都有优质技术文章推送。
微信扫一扫下方二维码即可关注: