事件处理机制

事件处理机制
在传统的观察者模式中,事件及事件触发
事件,需要单独一个类。
事件触发,一般需要在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的内容进行选择性执行那个方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值