最近被一首歌曲给洗脑了,什么是快乐星球,什么是快乐星球,什么是快乐星球???
导致我最近学习的时候,就会出现快乐星球式的三段问。
什么是观察者模式?什么是观察者模式?到底什么是观察者模式?今天就一起研究研究,什么是观察者模式!
抛开定义来说说观察者模式
-
课堂上老师宣布下课放学时,同学们纷纷离开教室回家。
-
田径场上,裁判打枪后运动员们疾驰而出。
-
城市道路上交通信号灯由红色变为绿色时,汽车行人有序开始通行。
可能你会问,这些跟我要学的观察者模式有什么关系吗?
在以上这些场景中,我们能看出,他们有一个共同点,当一个对象的状态发生改变时,其他的一些依赖于这个对象的对象们,也会发生变化。
没错,观察模式的简单定义即是如此!
观察者模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式
观察者模式结构图
结构图解读
从上面的结构图中,我们可以清晰的看到有五个部分组成
- Subject 抽象目标
- ConcreteSubject 具体目标
- Observer 观察者接口
- ConcreteObserve1 具体观察者1
- ConcreteObserve2 具体观察者2
我们可以看出,抽象目标Subject中定义了对观察者的一些操作方法以及一个观察者集合。具体观察者实现Observer接口。其中的关系一目了然,如果你不能完全理解上面的结构图推荐你去回顾一下UML统一建模语言。【UML专栏】
按照结构图编写代码
// Observer 接口
public interface Observer{
// 观察者响应方法
void response();
}
// 抽象目标类
public abstract class Subject{
// 观察者集合
protected List<Observer> observerList=new ArrayList<>();
// 添加观察者
public void addObserver(Observer o){
observerList.add(o);
}
// 移除观察者
public void removeObserver(Observer o){
observerList.remove(o);
}
// 通知观察者
public void notifyAllObservers(){};
}
// 具体观察者
public class ConcreteObserve1 implements Observer{
// 实现响应的方法
@Override
public void response(){
System.out.println("Rain say Hello");
}
}
// 具体目标
public class ConcreteSubject extends Subject{
@Override
public void notifyAllObservers() {
for (Observer o: observerList
) {
o.response();
}
}
}
我们可以根据具体的场景去实现观察者模式。
在我们熟悉的spring框架中,已经为我们实现好了观察者模式,我们可以直接在spring中直接使用观察者模式。
spring中的观察者模式
在spring中观察者模式封装了四个角色
事件(ApplicationEvent)
ApplicationEvent 是所有事件对象的父类。ApplicationEvent 继承自 jdk 的 EventObject, 所有的事件都需要继承 ApplicationEvent, 并且通过 source 得到事件源。
事件监听(ApplicationListener)
ApplicationListener 事件监听器,也就是观察者。继承自 jdk 的 EventListener,该类中只有一个方法 onApplicationEvent。当监听的事件发生后该方法会被执行。
事件发布(ApplicationContext)
ApplicationContext 是 Spring 中的核心容器,在事件监听中 ApplicationContext 可以作为事件的发布者,也就是事件源。因为 ApplicationContext 继承自 ApplicationEventPublisher。在 ApplicationEventPublisher 中定义了事件发布的方法 — publishEvent(Object event)
事件管理(ApplicationEventMulticaster)
ApplicationEventMulticaster 用于事件监听器的注册和事件的广播。监听器的注册就是通过它来实现的,它的作用是把 Applicationcontext 发布的 Event 广播给它的监听器列表。
// 定义事件
@Component
public class MyEvent extends ApplicationEvent {
public MyEvent(ApplicationContext source) {
super(source);
System.out.println("MyEvent 构造器执行~~~~~~");
}
public void sayHello(){
System.out.println("业务方法执行~~~~~~~~");
}
}
// 定义监听者
@Component
public class MyListenerA implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent myEvent) {
System.out.println("监听者A收到通知~~~~~~~~");
myEvent.sayHello();
}
}
// 定义事件发布者
@Component
public class MyPublisher implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
public void publisherEvent(MyEvent myEvent) {
System.out.println("---开始发布 myEvent 事件---");
applicationContext.publishEvent(myEvent);
}
}
// 测试
@Autowired
private MyPublisher myPublisher;
@Autowired
private MyEvent myEvent;
@Test
public void main() {
myPublisher.publisherEvent(myEvent);
}
关于spring观察者模式更详细的分享在这里spring观察者详解