• Tomcat中的观察者模式


    1. 几个重要的类,接口

      LifeCycle : 主题接口

      LifeCycleBase : 抽象的主题实现

      LifeCycleListener : 观察者

    2. 具体分析

      

    public interface Lifecycle {   //主题接口
    
    
        // ----------------------------------------------------- Manifest Constants
    
    
        /**
         * The LifecycleEvent type for the "component before init" event.
         */
        public static final String BEFORE_INIT_EVENT = "before_init";   //定义了tomcat启动时的状态
    
    
        /**
         * The LifecycleEvent type for the "component after init" event.
         */
        public static final String AFTER_INIT_EVENT = "after_init";
    
    
        /**
         * The LifecycleEvent type for the "component start" event.
         */
        public static final String START_EVENT = "start";
    
    
        /**
         * The LifecycleEvent type for the "component before start" event.
         */
        public static final String BEFORE_START_EVENT = "before_start";
    
    
        /**
         * The LifecycleEvent type for the "component after start" event.
         */
        public static final String AFTER_START_EVENT = "after_start";
    
    
        /**
         * The LifecycleEvent type for the "component stop" event.
         */
        public static final String STOP_EVENT = "stop";
    
    
        /**
         * The LifecycleEvent type for the "component before stop" event.
         */
        public static final String BEFORE_STOP_EVENT = "before_stop";
    
    
        /**
         * The LifecycleEvent type for the "component after stop" event.
         */
        public static final String AFTER_STOP_EVENT = "after_stop";
    
    
        /**
         * The LifecycleEvent type for the "component after destroy" event.
         */
        public static final String AFTER_DESTROY_EVENT = "after_destroy";
    
    
        /**
         * The LifecycleEvent type for the "component before destroy" event.
         */
        public static final String BEFORE_DESTROY_EVENT = "before_destroy";
    
    
        /**
         * The LifecycleEvent type for the "periodic" event.
         */
        public static final String PERIODIC_EVENT = "periodic";
    
    
        /**
         * The LifecycleEvent type for the "configure_start" event. Used by those
         * components that use a separate component to perform configuration and
         * need to signal when configuration should be performed - usually after
         * {@link #BEFORE_START_EVENT} and before {@link #START_EVENT}.
         */
        public static final String CONFIGURE_START_EVENT = "configure_start";
    
    
        /**
         * The LifecycleEvent type for the "configure_stop" event. Used by those
         * components that use a separate component to perform configuration and
         * need to signal when de-configuration should be performed - usually after
         * {@link #STOP_EVENT} and before {@link #AFTER_STOP_EVENT}.
         */
        public static final String CONFIGURE_STOP_EVENT = "configure_stop";
    
    
        // --------------------------------------------------------- Public Methods
    
    
        /**
         * Add a LifecycleEvent listener to this component.
         *
         * @param listener The listener to add
         */
        public void addLifecycleListener(LifecycleListener listener);     //注册观察者的方法
    
    
        /**
         * Get the life cycle listeners associated with this life cycle.
         *
         * @return An array containing the life cycle listeners associated with this
         *         life cycle. If this component has no listeners registered, a
         *         zero-length array is returned.
         */
        public LifecycleListener[] findLifecycleListeners();              //获得所有的观察者的方法
    
    
        /**
         * Remove a LifecycleEvent listener from this component.
         *
         * @param listener The listener to remove
         */
        public void removeLifecycleListener(LifecycleListener listener);    //移除观察者的方法
    
    
        /**
         * Prepare the component for starting. This method should perform any
         * initialization required post object creation. The following
         * {@link LifecycleEvent}s will be fired in the following order:
         * <ol>
         *   <li>INIT_EVENT: On the successful completion of component
         *                   initialization.</li>
         * </ol>
         *
         * @exception LifecycleException if this component detects a fatal error
         *  that prevents this component from being used
         */
        public void init() throws LifecycleException;             //初始化容器的方法
    
        /**
         * Prepare for the beginning of active use of the public methods other than
         * property getters/setters and life cycle methods of this component. This
         * method should be called before any of the public methods other than
         * property getters/setters and life cycle methods of this component are
         * utilized. The following {@link LifecycleEvent}s will be fired in the
         * following order:
         * <ol>
         *   <li>BEFORE_START_EVENT: At the beginning of the method. It is as this
         *                           point the state transitions to
         *                           {@link LifecycleState#STARTING_PREP}.</li>
         *   <li>START_EVENT: During the method once it is safe to call start() for
         *                    any child components. It is at this point that the
         *                    state transitions to {@link LifecycleState#STARTING}
         *                    and that the public methods other than property
         *                    getters/setters and life cycle methods may be
         *                    used.</li>
         *   <li>AFTER_START_EVENT: At the end of the method, immediately before it
         *                          returns. It is at this point that the state
         *                          transitions to {@link LifecycleState#STARTED}.
         *                          </li>
         * </ol>
         *
         * @exception LifecycleException if this component detects a fatal error
         *  that prevents this component from being used
         */
        public void start() throws LifecycleException;     //启动容器的方法
     
    
        /**
         * Gracefully terminate the active use of the public methods other than
         * property getters/setters and life cycle methods of this component. Once
         * the STOP_EVENT is fired, the public methods other than property
         * getters/setters and life cycle methods should not be used. The following
         * {@link LifecycleEvent}s will be fired in the following order:
         * <ol>
         *   <li>BEFORE_STOP_EVENT: At the beginning of the method. It is at this
         *                          point that the state transitions to
         *                          {@link LifecycleState#STOPPING_PREP}.</li>
         *   <li>STOP_EVENT: During the method once it is safe to call stop() for
         *                   any child components. It is at this point that the
         *                   state transitions to {@link LifecycleState#STOPPING}
         *                   and that the public methods other than property
         *                   getters/setters and life cycle methods may no longer be
         *                   used.</li>
         *   <li>AFTER_STOP_EVENT: At the end of the method, immediately before it
         *                         returns. It is at this point that the state
         *                         transitions to {@link LifecycleState#STOPPED}.
         *                         </li>
         * </ol>
         *
         * Note that if transitioning from {@link LifecycleState#FAILED} then the
         * three events above will be fired but the component will transition
         * directly from {@link LifecycleState#FAILED} to
         * {@link LifecycleState#STOPPING}, bypassing
         * {@link LifecycleState#STOPPING_PREP}
         *
         * @exception LifecycleException if this component detects a fatal error
         *  that needs to be reported
         */
        public void stop() throws LifecycleException;    //关闭容器的方法
    
        /**
         * Prepare to discard the object. The following {@link LifecycleEvent}s will
         * be fired in the following order:
         * <ol>
         *   <li>DESTROY_EVENT: On the successful completion of component
         *                      destruction.</li>
         * </ol>
         *
         * @exception LifecycleException if this component detects a fatal error
         *  that prevents this component from being used
         */
        public void destroy() throws LifecycleException;  
    
    
        /**
         * Obtain the current state of the source component.
         *
         * @return The current state of the source component.
         */
        public LifecycleState getState();     //获取容器当前所处的状态
    
    
        /**
         * Obtain a textual representation of the current component state. Useful
         * for JMX. The format of this string may vary between point releases and
         * should not be relied upon to determine component state. To determine
         * component state, use {@link #getState()}.
         *
         * @return The name of the current component state.
         */
        public String getStateName();
    
    
        /**
         * Marker interface used to indicate that the instance should only be used
         * once. Calling {@link #stop()} on an instance that supports this interface
         * will automatically call {@link #destroy()} after {@link #stop()}
         * completes.
         */
        public interface SingleUse {
        }
    }
    public abstract class LifecycleBase implements Lifecycle {   //主题的抽象实现
    
        private static final Log log = LogFactory.getLog(LifecycleBase.class);
    
        private static final StringManager sm = StringManager.getManager(LifecycleBase.class);
    
    
        /**
         * The list of registered LifecycleListeners for event notifications.
         */
        private final List<LifecycleListener> lifecycleListeners = new CopyOnWriteArrayList<>();   //用来存储所有注册的观察者
    
    
        /**
         * The current state of the source component.
         */
        private volatile LifecycleState state = LifecycleState.NEW;   
    
    
        /**
         * {@inheritDoc}
         */
        @Override
        public void addLifecycleListener(LifecycleListener listener) {    //注册观察者,将观察者添加到数组中
            lifecycleListeners.add(listener);
        }
    
    
        /**
         * {@inheritDoc}
         */
        @Override
        public LifecycleListener[] findLifecycleListeners() {         //返回观察者数组
            return lifecycleListeners.toArray(new LifecycleListener[0]);
        }
    
    
        /**
         * {@inheritDoc}
         */
        @Override
        public void removeLifecycleListener(LifecycleListener listener) { //移除观察者的实现
            lifecycleListeners.remove(listener);
        }
    
    
        /**
         * Allow sub classes to fire {@link Lifecycle} events.
         *
         * @param type  Event type
         * @param data  Data associated with event.
         */
        protected void fireLifecycleEvent(String type, Object data) {   //发布通知的方法
            LifecycleEvent event = new LifecycleEvent(this, type, data);  //将信息封装成一个LifecycleEvent类型的对象,LifecycleEvent对象用来统一封装所有的信息。
            for (LifecycleListener listener : lifecycleListeners) {      //遍历所有的观察者,并发布通知
                listener.lifecycleEvent(event);
            }
        }
    
    }

      

    public interface LifecycleListener {  //观察者接口
    
    
        /**
         * Acknowledge the occurrence of the specified event.
         *
         * @param event LifecycleEvent that has occurred
         */
        public void lifecycleEvent(LifecycleEvent event);  //接受通知的方法
    
    
    }

    可见 tomcat中通过观察者模式来对容器的生命周期进行控制

  • 相关阅读:
    四.单例模式
    三.创建型模式的特点和分类
    二.设计模式原则
    一.软件设计模式的基本要素
    jvm之年轻代(新生代)、老年代、永久代以及GC原理详解、GC优化
    Java NIO系列教程(十一) Java NIO DatagramChannel
    Java NIO系列教程(十)client和server 示例
    Java NIO系列教程(九) ServerSocketChannel
    Java NIO系列教程(八) SocketChannel
    MySQL读写分离
  • 原文地址:https://www.cnblogs.com/liwangcai/p/11652759.html
Copyright © 2020-2023  润新知