首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

五分钟学会观察者模式

介绍

观察者模式:多个观察者同时监听一个主题对象,当主题对象发生改变时,它的所有观察者都会收到通知。

例如微信公众号,当作者发文时,所有的订阅者都会收到。这样观察者模式就能实现广播,同时符合开闭原则,增加新的观察者不用改原有的代码。

观察者模式的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

如果你对服务信息比较感兴趣,如想对数据进行持久化,就可以监听这些事件,是不是可扩展性特别好?

好文章,我 “在看”

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200312A0QLX200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券