一、观察者模式的概念
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象
并且在它本身的状态改变时主动发出通知,通过调用各观察者所提供的方法来实现
此种模式通常被用来实时事件处理系统
观察者模式又叫做发布-订阅模式、模型-视图模式、源-监听器模式或从属者模式
抽象主题(Subject):抽象主题角色把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题(ConcreteSubject):将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。
具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态协调。具体观察者角色可以保持一个指向具体主题对象的引用。
二、观察者模式的实现
//抽象主题
public abstract class Subject {
//关联多个观察者
private List<Observer> list = new ArrayList<>();
public void Attach(Observer observer){
list.add(observer);
}
public void Delete(Observer observer){
list.remove(observer);
}
//通知观察者主题的状态已改变
public void Notify(String state){
for (Observer observer : list){
observer.Update(state);
}
}
}
//具体主题
public class ConcreteSubject extends Subject {
private String state;
public String getState(){
return state;
}
//改变自身状态,并通知观察者
public void change(String newState){
state = newState;
this.Notify(newState);
}
}
//抽象观察者
public abstract class Observer {
public abstract void Update(String state);
}
//具体观察者
public class ConcreteObserver extends Observer {
private String state;
@Override
//依据主题状态更新自身状态
public void Update(String newState) {
state = newState;
}
}
三、观察者模式的应用
Spring中事件驱动模型:事件源—ApplicationContext,事件—ApplicationEvent,事件监听器—ApplicationListener,
事件广播器—ApplicationEventMulticaster(把ApplicationContext发布的Event广播给所有的监听器)
四、观察者の其他问题
pros and corns
观察者模式在观察目标和观察者之间建立一个抽象的耦合
如果一个主题关联多个观察者,将所有的观察者都通知到会花费很多时间
如果在观察者和主题之间循环依赖,主题会触发它们之间循环调用,可能导致系统崩溃
观察察者模式推方式:
主题对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据
观察察者模式拉方式:
主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当于是观察者从主题对象中拉数据。一般把主题对象自身传递给观察者,观察者需要获取数据的时候,通过这个引用来获取了
在JDK的java.util包中,提供了Observable类主题需要继承这个类,Observer接口观察者需要实现这个接口,它们构成了Java语言对观察者模式的支持
五、Reference
设计模式(行为型)之观察者模式(Observer Pattern)
spring事件驱动模型--观察者模式在spring中的应用
六、Resource