事件处理机制

事件处理机制
在传统的观察者模式中,事件及事件触发
   事件,需要单独一个类。
   事件触发,一般需要在client手动进行触发,执行notify的方法

在jbpm中,fire(Event.END,xx,XX)
含义是 系统执行到这个地方,自动触发一个事件,这个与 在观察者中的,在client,手段执行一个notify()的动作是一样的。
  触发这个动作,目的是执行一个list<> 观察者的列表方法,在jbpm中,没有这个数组,仅执行一个Eventlister类这样的一个perform动作。在这个动作中,读取xml中类名与事件的关系,然后判断是否是这个事件类型的,如果是,就执行这个事件处理类,否则忽略。

在设计模式之禅中
  createproduct在这个方法最好,触发一个事件,该事件处理方法就放入到该事件中去了,在该事件的构造函数中,执行一个通知。
  在jbpm中,是有一个Event.End这个事件,然后单独一个Fire方法。单在设计之禅中,fire这个动作中,就调用了事件本身的notify内容。

在dom解析xml时候,事件要登记在builder中,便于更友好的跟踪这个解析出错结果。
DocumentBuilder可以注册一个Errohandle(SAXparseException),在执行documentBuilder.parse时候,会触发这个Errohandle(SAXparseException).
猜想它的处理方式如下
  DocumentBuilder{
    private Errohandle;
    get;set Errohandle;
    public void parse(File file)
      {
try{
        parsedoing();
}
catch{
        if(Errohandle!=null)//因为这个类,可能并不调用setErrohandle方法,即并不触发事件
          {
            Errohandle.error(SAXparseException);
             Errohandle.FetalError(SAXparseException);
             Errohandle.warning(SAXparseException);
          }
      }
}
}
事件:SAXparseException
事件触发,parse方法
事件处理Errohandle(观察者)

Errohandle使一个接口,可作为一个匿名类在调用的时候,在client端进行书写,这样就可以方便的重定义错误的处理方式。

http://www.oschina.net/code/explore/jdk16/javax/xml/parsers/DocumentBuilderFactory.java

在jdk的jar包中package javax.xml.parsers; DocumentBuilderFactory是一个抽象类

public static DocumentBuilderFactory newInstance() { 

122         try { 

123             return (DocumentBuilderFactory) FactoryFinder.find( 

124                 /** The default property name according to the JAXP spec */

125                 "javax.xml.parsers.DocumentBuilderFactory", 

126                 /** The fallback implementation class name */

127                 "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); 

128         } catch (FactoryFinder.ConfigurationError e) { 

129             throw new FactoryConfigurationError(e.getException(), 

130                                                 e.getMessage()); 

131         } 

132   

133     } 

134   

其实现在如下代码中

http://www.oschina.net/code/search?q=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

针对sax解析方式,也有2种。一种是xmlreader的解析方式,另外一种是saxreader的解析方式
在xmlreader解析方式下
   要设置4个监听器,每个监听器有2-4个方法。估计在parse的时候,会对3个监听器要依次调用,调用的时候,估计就是把几个监听器的方法采用switch语句在parse中根据input的内容进行解析,如果碰到开始等就调用监听程序。缺点就是以后无法添加新的监听器了。因为无公开的添加监听器的方法。估计的原因是不需要扩展监听器,因为xml的结构是恒定的。

在saxreader的解析器下
  只要设置一个defaulthandle继承这4个接口。然后传入到parse中,在parse中的步骤应该是一样的。

这种方式与传统的观察者差异性在与,以前的观察者一般是一个update的方法。现在的观察者可能是多个方法。根据调用者不同的情况下,触发观察者的方法。

另外需要查一下,javax.xml;与org.xml的package分别是什么?要引用的时候放入哪些jar包中


下午
   看到dom4j采用的visitor模式

在element继承一个接口。该接口有一个accept方法
accept(ivistor)
{
   ivisitor.visit(this)
}
在每一个visitor中,有每个具体的elecment作为visit参数。这样就可以访问在element之外对每个元素进行单独处理。
   具体的描述在疯狂xml讲义 P342
可参考http://blog.sina.com.cn/s/blog_636415010100vabc.html类图及解释

观察者模式,访问者模式
观察者模式中,每个观察者是一个方法

访问者模式是将多个观察者的1个方法合并在一个类中,行程多个方法。然后通过双委派的方式来执行。启动这个观察事件的是,在element中执行accept(ivistor)的方法。这样多个观察者单体方法组成的visitor就好根据this的内容进行选择性执行那个方法。

猜你喜欢

转载自sunsteven.iteye.com/blog/1579533