本来打算这篇继续和大家一起讨论springboot启动源码的,可觉得再讲源码估计大家都没有看下去的勇气了,那么今天,我们不讲springboot的启动源码,我们先来看看一个有趣的内容,具体是什么,大家应该已经知道了,没错就是标题中的 – spring-boot事件。
可能有小伙伴觉得奇怪了,好好的源码系列不讲了,怎么突然讲一个无关紧要的内容呢?那么真的是无关紧要的内容吗?关于这个疑问后面会有解答。目前大家就权当放松了,以一种轻松的心态和我一起往下看。
观察者模式说好的不是讲springboot的事件机制吗,怎么又讲什么观察者模式呢?心里会说:“楼主,你还好吗,你今天是不是被门夹了?”。楼主:“被门夹?不存在的,一般只有我夹门......”
还是那就话,大家放松心态慢慢看,心中的疑问先放在心里或者用笔记录下来,后面会慢慢解开的。
概念其实很简单,两个主体,一个观察者,一个被观察者,当被观察者发生变化时,观察者会有相应的动作。举几个例子,和我们日常生活息息相关的红绿灯,灯就相当于被观察者,行人就相当于观察者,当灯发生变化时,行人会有相应的动作:红灯停,绿灯行,黄灯亮了等一等。再比如我们现在玩的公众号,当我们订阅了某个公众号之后,公众号每发表一篇文章,就会向订阅了它的用户发送这篇文章,我们就可以浏览这篇文章了;当我们取消订阅了,它就不会再向我们推送这篇文章了;只要这个公众号一直在运行,就会一直有人订阅它或者取消订阅。这两个主体有个统一的称呼:被观察者成为主题(Subject),观察者仍是称为观察者(Observer)。
观察者模式还有很多其他的称谓,如发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
理论上的东西讲的再多也只是停留在理论,下面我们来实现下,到底观察者模式是个什么神奇的东西。
类图所涉及到的角色如下:
抽象主题(Subject):提供接口,可以增加和剔除观察者对象。一般用抽象类或者接口实现。
抽象观察者(Observer):提供接口,在得到主题的通知时更新自己。一般用抽象类或者接口实现。
具体主题(ConcreteSubject):将有关状态存入具体观察者,在具体主题的内部状态发生变化时,给所有注册过的观察者发出通知。一般是具体子类实现。
具体观察者(ConcreteObserver):存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用
在上述类图中,ConcreteSubject中有一个存储Observer的列表,这意味着ConcreteSubject并不需要知道引用了哪些ConcreteObserver,只要实现(继承)了Observer的对象都可以存到该列表中。在需要的时候调用Observer的update方法。
一般实现Subject:
package com.lee.myobserver; /** * 抽象主题 * 提供具体主题需要实现的接口 */ public interface Subject { /** * 注册观察者 * @param observer */ void attach(Observer observer); /** * 移除观察者 * @param observer */ void detach(Observer observer); /** * 通知所有注册的观察者 */ void notifyObservers(); }