一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
作用:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。
创建 Subject 主题类。用一个list保存所有的观察者,添加一个notify通知方法,遍历所有观察者,依次调用通知方法。
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(this.state);
}
}
}
定义接口, obj 通知数据对象
public interface Observer {
void update(Object obj);
}
实现观察者
public class OctalObserver implement Observer{
@Override
public void update(Object obj) {
System.out.println( "in Octal String obj: "+obj.toString() );
}
}
使用,将观察者与主体绑定,当有消息时通知观察者。
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
Observer oct = new OctalObserver();
// 添加观察者
subject.attach(oct);
subject.notifyAllObservers();
}
}
java中的应用其一是swing中的事件EventBus,对一个按钮添加监听,按钮触发后会通知添加的监听事件EventListener。
观察者模式更像是mq消息,观察者关注哪个消息主题,当有消息是会通知所有的观察者。这样更好理解。
spring中的观察者模式
spring中的ApplicationContext上下文内容变化的时候,会通过ApplicationEvent像所有监听事件的观察者EventListener发布消息。此过程在SpringApplication.run() 启动过程查看源码尤为明显。