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,所以我把它叫做事件源