介绍
观察者模式:多个观察者同时监听一个主题对象,当主题对象发生改变时,它的所有观察者都会收到通知。
例如微信公众号,当作者发文时,所有的订阅者都会收到。这样观察者模式就能实现广播,同时符合开闭原则,增加新的观察者不用改原有的代码。
观察者模式的UML图如下
Subject(主题):定义了观察者集合,提供注册,删除,通知观察者的方法
ConcreteSubject(具体主题)
Observer(观察者):定义了收到主题通知时所做的改变
ConcreteObserver(具体观察者)
手写观察者模式
以微信公众号为例写一个观察者模式
抽象主题
抽象观察者
具体主题
具体观察者
测试类
输出为
观察者模式的应用
JDK提供了观察者模式接口
Java在java.util包中有对观察者模式进行支持,它定义了2个接口
抽象观察者
抽象主题
和我们之前定义的很相似哈,只是多了一个change的开关字段,并且保证了线程安全
我们来把之前的例子改写一下,定义事件对象
输出和上面一样
在spring中自定义事件
Spring用观察者模式来实现事件监听,在spring中实现事件监听比较简单,还是把上面的例子改造一下
事件类型需要继承ApplicationEvent类
我们可以通过实现ApplicationListener接口或者使用@EventListener注解来实现事件监听
此时可以看到控制台输出
好了,到现在你已经会在spring中自定义事件了。spring中观察者模式的实现可能复杂一点,但基本思想就是上面提到的。
ApplicationEvent是Spring的事件接口
ApplicationListener是Spring的事件监听器接口,所有的监听器都实现该接口
ApplicationEventPublisher是Spring的事件发布接口,ApplicationContext实现了该接口
spring提供了一些ApplicationEvent的实现类供我们使用
ContextStartedEvent:ApplicationContext容器在初始化的时候发布的事件类型
ContextClosedEvent:ApplicationContext容器在即将关闭的时候发布的事件类型
ContextRefreshedEvent:ApplicationContext容器在初始化或者刷新的时候发布的事件类型
如果你想知道spring定义好的事件在项目中的应用。你可以看我之前的文章,看我们是如何利用注解+spring事件来实现策略模式的
自定义事件在spring-cloud-eureka中的应用
我们都知道eureka是一个注册中心,保存了服务名->具体的ip地址的关系,它是用
ConcurrentHashMap来保存这种映射关系的。既然是注册中心肯定涉及到服务的注册和取消,eureka在register(注册),cancel(取消),renew(续约)发生时,都会发布一个事件,如下代码所示
InstanceRegistry.java
如果你对服务信息比较感兴趣,如想对数据进行持久化,就可以监听这些事件,是不是可扩展性特别好?
好文章,我 “在看”
领取专属 10元无门槛券
私享最新 技术干货