從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判斷事件的類型,完成相應的動做。
相關文章
相關標籤/搜索