从tomcat中学习观察者模式

首先须要了解何为观察者模式。
有2我的A、B,其中A会随机作一些动做,B做为观察者,他会观察A的动做。若是B对A的某个动做感兴趣,那么他就会在A作这个动做的时候作一些本身的动做。这就是观察者模式。java

观察者模式中有3类对象:
一、抽象主题。
二、具体主题。
三、观察者。
前面那个例子中,A能够看做主题,B就是观察者。数组

这里可能有一个理解上的误区,观察者B看到主题A作某件事情,而后他本身跟着作一些动做。从语义上来理解,彷佛观察者B是主动作动做。但实际上不是这样的,观察者B须要将本身“注册”到A中,而后由A通知B,说我要作XX事情了,若是B对这件事情感兴趣,他就会作本身想作的动做。“注册”其实就是一个引用,即A持有一个B的引用,当A作某件事情的时候,他使用本身持有的B的引用,调用B想要作的方法。也就是说这其实彻底是一个被动的过程。
在我看来,正由于如此,观察者模式也被称为“发布-订阅”模式。观察者B要到A那订阅消息,A才能通知到B本身在作某件事。tomcat

tomcat中的观察者模式:

tomcat中Lifecycle就是抽象的主题。
而后像StandardEngine、StandardHost、StandardContext这类Container对象,都是具体主题。
LifecycleListener定义了观察者想要执行的方法。就是前面提到的,若是观察者对主题的某个动做感兴趣,他就会作本身的动做,这个动做就是LifecycleListener里的方法。固然LifecycleListener是一个接口,用户能够定义各类具体的观察者。
tomcat对观察者模式作了很好的扩展,他增长了一个LifecycleSupport来代替主题管理多个观察者,把功能模块分得更清晰,LifecycleSupport中定义了一个LifecycleListener的数组。主题中某动做发生时,LifecycleSupport会遍历此数组,对每个listener调用它们像要作的方法。
下面的方法就是LifecycleSupport通知各个LifecycleListener某事件发生了。
ui

/**
     * Notify all lifecycle event listeners that a particular event has
     * occurred for this Container.  The default implementation performs
     * this notification synchronously using the calling thread.
     *
     * @param type Event type
     * @param data Event data
     */
    public void fireLifecycleEvent(String type, Object data) {

        LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
        LifecycleListener interested[] = listeners;
        for (int i = 0; i < interested.length; i++)
            interested[i].lifecycleEvent(event);

    }

tomcat中将事件定义为LifecycleEvent
/**
     * Construct a new LifecycleEvent with the specified parameters.
     *
     * @param lifecycle Component on which this event occurred
     * @param type Event type (required)
     * @param data Event data (if any)
     */
    public LifecycleEvent(Lifecycle lifecycle, String type, Object data) {

        super(lifecycle);
        this.type = type;
        this.data = data;
    }
事件有一个属性type,用来标明事件的类型。 也就是说tomcat中观察者模式流程: 一、将观察者listener增长到LifecycleSupport的listener数组中 二、当container(主题)作某些动做的时候,会生成一个LifecycleEvent对象,这个对象标明当前这个动做是一个什么事件,而后LifecycleSupport会通知listener数组中的每个观察者该事件的发生。 三、listener会根据LifecycleEvent判断事件的类型,完成相应的动做。
相关文章
相关标签/搜索