定义
观察者模式又称为 发布订阅模式(这个名称更容易理解)。它指的是,当一个对象的内部状态发生改变时,通知登记过的对象,针对变化做出自己的操作。
观察者模式作为一种行为型设计模式,主要目的,就是为了把不同的业务行为代码解耦
UML
Subject:表示某一个主题,定义了添加 / 删除 / 通知 Observe 的功能
PublishSubject:消息发布实现类
Observe:观察者接口,定义了观察者动作的方法,由 Subject 中的 notifyObserves() 方法来通知调用
OneObserve:观察者实现类,完成观察者的动作
实际应用
在Spring中的应用
在 Spring 中,常用的有一个 ApplicationListener(同 Observe)+ ApplicationEventMulticaster (同 Subject),也是采用观察者模式来处理的。
我们可以通过实现 ApplicationListener.onApplicationEvent(applicationEvent) 方法,选择不同的 applicationEvent,当完成对应的 applicationEvent 后,发出某些事件动作通知(即执行onApplicationEvent 方法)。
下面的用例中,通过注册关闭事件,在 Spring 容器销毁 Bean 之前,去关闭手动生成的一个线程池(该实现可参考)。
@Configuration
public class ThreadPoolConfig implements ApplicationListener<ContextClosedEvent> {
@Override
public void onApplicationEvent(ContextClosedEvent event) {
try {
//saveData2DbThreadPool的关闭,没有被Spring监听到,所以手动告知Bean销毁前关闭ExecutorService
saveData2DbThreadPool.shutdown();
saveData2DbThreadPool.awaitTermination(3, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("线程 Interrupted 失败");
}
}
}