当前位置: 首页 > 后端技术 > Java

深入设计模式——观察者模式

时间:2023-04-01 17:52:09 Java

1.观察者模式介绍2.用代码演示观察者模式3.总结4.spring源码中,观察者模式的应用1.观察者模式介绍定义:定义1对象之间的一种一对多的依赖关系,这样当每个对象发生变化时状态,所有依赖它的对象都会被通知并自动更新。2)简单来说,观察者模式多用于当一个对象的状态发生变化时,与之相关的另一个对象也会发生变化,比如将代码传递到一个固定的分支,然后系统自动部署,比如添加数据库一条订单消息,然后群消息会自动收到订单提醒。这两个函数有一个相似点,就是每当一个状态改变时,另一个对象也会随之改变。这种场景适合使用观察者模式。观察者模式的作用:观察者:观察者一般是一个接口,只有一个通知方法,当被观察对象的状态发生变化时会触发该方法。具体观察者:实现观察者接口的观察者是为了方便扩展,可以在角色中定义具体的业务逻辑,有点像策略模式。特定观察者:观察者接口的具体实现,在这个角色中,会定义被观察对象状态发生变化时要处理的逻辑。Observed:接口类,可以定义抽象方法让子类实现逻辑。SpecificObserver:实现了Observer的接口,可以在这里定义具体的业务逻辑。2.用代码演示观察者模式publicinterfaceIObserver{voidupdate();}publicclassObserverimplementsIObserver{//可以是一个从数据库中查出来的List,然后作为参数丢给下面的函数privateListpeopleList=newArrayList();@Overridepublicvoidupdate(){peopleList.stream().forEach(people->{people.execute();});}}publicinterfaceIPeople{voidexecute();}publicclassPeopleimplementsIPeople{@Overridepublicvoidexecute(){}}3.总结观察者模式其实是一种利用触发器形成调用链的方式,但是由于chain调用,有时经常会出现性能问题。4.spring源码中,观察者模式的应用在spring源码中,扩展了观察者模式,我们称之为事件驱动:执行过程:1)事件源发布不同的事件2)当发布后事件,使用multicaster方法广播事件,multicaster会触发特定的listener执行操作。3)监听器接收到具体事件后,可以验证匹配是否正在处理当前事件。如果是,则可以直接处理。如果没有,什么也不做。也就是说,event=这条调用链调用的原因multicaster=之前遍历的observer操作listener=observer事件源=具体要执行的逻辑我们来看看spring源码中是如何处理这些类的:1)准备N提前事件2)初始化多播器3)准备一系列监听器4)在多播器中注册已有的监听器5)准备事件发布通知多波设备循环调用监听器进行相位处理github注释源码:https//github.com/su15967456...