观察者模式、java事件驱动机制、Tomcat Lifecycle

1 观察者模式的实现

(1)被观察者维系一个观察者列表

(2)发生事件的时候,调用观察者方法(传入的参数中一般带上源事件)

父母观察孩子的代码示例,

/**
* Kid是被观察者,维系了一个观察者列表Parents,这里为了简单没有用List
*/
public class Kid extends Observable {
	private Parents myParents;
	
	public Parents getMyParents() {
		return myParents;
	}

	public void setMyParents(Parents myParents) {
		this.myParents = myParents;
	}

	public Kid() {
		if (null == myParents) {
			myParents = new Parents();
		}
		addObserver(myParents);
	}
	
	public void hungry() {
		System.out.println("Subject : I'm hungry!");
	}
	
	public void piss() {
		System.out.println("Subject : I want to piss!");
	}
}

/**
* Parents是观察者
*/
public class Parents implements Observer {
	@Override
	public void update(Observable o, Object arg) {
		feedKid();
	}
	
	public void feedKid() {
		System.out.println("Observer : feed my kid!");
	}
	
	public void helpKisPiss() {
		System.out.println("Observer : I'am coming to help you to piss!");
	}
}

/**
* 测试类
*/
public class ObserverTest {
	@Test
	public void testObserver() {
		Kid kid = new Kid();
		kid.hungry();
		kid.piss();
	}
	
}

2 java的事件驱动机制

2.1 java的事件驱动机制本质上就是观察者模式,区别在于多了一个EventObject的概念,EventObject的属性Object source才是真正的事件源。

2.2 java事件驱动机制的实现(本质上和上面的实现方法一样)

     2.2.1 事件源Obejct source维系一个监听器(EventListener)列表(这里把观察者换成了监听器而已)

     2.2.2 发生事件的时候(例如初始化init()方法的时候),调用监听器的fireXXXEvent,传入持有source的EventObject参数以其他参数

   2.2.3 为什么需要多一个EventObject呢?原因是不用源事件source去继承被观察者,可以省去这一部分的逻辑。

 

3 Tomcat的Lifecycle实现

  3.1 Tomcat的事件驱动机制类图,其中重要的方法都简要的写出来了

3.2 看最下面的server、engine、host、context应该很熟悉了吧,在Tomcat中都是源事件source,并且都维系了一个监听器列表,例如StandardServer

 public StandardServer() {

        super();

        globalNamingResources = new NamingResourcesImpl();
        globalNamingResources.setContainer(this);

        if (isUseNaming()) {
            namingContextListener = new NamingContextListener();
            addLifecycleListener(namingContextListener);
        } else {
            namingContextListener = null;
        }

    }

3.3 Tomcat事件驱动的实现

   3.3.1 Server、Engine、Host、Context这些都是源事件source,也就是被观察者

   3.3.2 发生事件的时候,例如初始化的时候,调用监听器的fireLifecycleEvent()方法

            注意这里面的LifecycleEvent(this,type,data)中的this会用来初始化EventObject中的Object source

protected void fireLifecycleEvent(String type, Object data) {
        LifecycleEvent event = new LifecycleEvent(this, type, data);
        for (LifecycleListener listener : lifecycleListeners) {
            listener.lifecycleEvent(event);
        }
    }

PS:

   被观察者=事件源,因为EventObject的属性Object source,所以我把它叫做事件源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值