探讨与比较Java和.NET的事件处理框架-Java基础-Java-编程开发
2008-05-20 06:14
761 查看
google_ad_client = "pub-8800625213955058";
/* 336x280, 创建于 07-11-21 */
google_ad_slot = "0989131976";
google_ad_width = 336;
google_ad_height = 280;
//
事件驱动模型
事件驱动模型是软件系统平台中的一个重要区域,现代软件系统大量地使用事件驱动的处理方法 ,尤其在用户界面方面。虽然如此,过去在软件开发语言中一直没有融入事件处理的因子,直到.net的出现,才将事件处理的工作负荷一部分的分派给编译 器,从而稍微减轻开发者的负担。
下图显示事件模型的组成份子:
Subscriber需事先和publisher预订要接受其发布的某事件(下图a1),publisher在某事件发生以后 ,必需先生成该事件的相关数据对象(下图a2.1),然后通过方法调用来通知subscriber(下图a2.2),也就是用回调(callback)的方式来通知 subscriber。当然在预订的时候,并不一定要由subscriber自身来预订,也可以由另一个对象来帮忙预订。其动态图形示意如下:
本文并不探讨异步的信息传送,也就是在整个事件的处理过程当中,publisher和subscriber 对象皆 需要同时存在。如果对于离线(offline)的方式来处理事件有兴趣的话,请参阅Java的JMS(Java Message Service)和.NET的LCE(Loosely Coupled Events)。
事件是什么?
那么,到底事件是什么?在软件系统中要如何表达一个事件?一个事件应 该包括两个东西:识别事件的名称(event identity),和事件的相关的数据(event data)。例如,一个键盘按键被按下的事件可能叫KeyPressedEvent, 事件数据则为该按键的代码。
先前提到发布事件是用调用方法的方式(回调),不过有一个问题,就是publisher无法事先知道subscriber 的类型。在Java的编码模式当中,回调可以使用接口模式,也就是publisher必需事先定义好一个在发布事件中使用的接口,subscriber实现该接口中的方 法,publisher则通过调用接口中的方法来完成发布事件的工作。如下图:
这样,在Java的编码模式中,一个事件的识别名称就是接口名称和其中的方法名称,而事件数据则 自然是接口方法的参数了。Java对于这个接口的命名风格为XXXListener,顾名思义就是某事件的倾听者。例如:
public interface KeyListener extends EventListener {
public void keyTyped(KeyEvent e);
public void keyPressed(KeyEvent e);
public void keyReleased(KeyEvent e);
} 由于一个接口中可以包含多个方法,所以Java在设计事件的时候,是将一组相关联的事件放在一起, 这样设计的优点是可以很好的将事件做分类,并且在publisher中如果要处理的事件较多的话,可以使用比较少的成员变量来记录subscribers。缺点是如果 subscriber只对事件接口中的部分事件有兴趣,也必需要全盘实现该接口(所以在AWT里有java.awt.event.XXXAdapter抽象辅助类)。另一个缺点则是必需 要为每一类事件定义一个接口类型,即使可能大部分的事件只有极少的方法。
微软在为C#语言命名的时候,就刻意隐喻C#是从C/C 为基 础发展而得的面向对象程序语言,始祖绝不是Java,所以肯定要保留一些C/C 的语言机制。在C/C 里面对回调的设计方式就是用函数指针,想当然C#也希望直接使用类似函数调用的方式来做为事件发布的方法。如下图:
所以C#期望使用函数指针类型来作为事件的识别名称,然后用函数的参数来传递事件数据。我们先用一段C 代码来描绘这幅图画 :
Event type definition:
// 定义KeyPressedCallback 为一个函数指针的类型,
// 该函数接受一个整数型参数,无返回值
typedef void (*KeyPressedCallback)(int keyCode);
Publisher:
class Publisher
{
public KeyPressedCallback KeyPressedSink = null;
...
void FireEvent(int KeyCode)
{
if (KeyPressedSink != null)
(*KeyPressedSink)(keyCode);//callback
}
}
Subscriber:
void KeyPressedHandler(int keyCode)
{
...
}
...
Publisher publisher = new Publisher();
//reGISter
publisher.KeyPressedSink = &KeyPressedHandler; 一个当代的纯面向对象程序语言,是肯定希望要把造成程序复杂和不易维护的指针给去除的。所以在C#语言机制当中,势必要创造新的元素来取代, 于是delegate(委托)出现了。如下:
Event type definition:
// 定义KeyPressedDelegate 为一个类似函数指针的类型 ,
// 该函数接受一个整数型参数,无返回值
delegate void KeyPressedDelegate(int keyCode);
Publisher:
class Publisher
{
public KeyPressedDelegate KeyPressed = null;
...
void FireEvent(int KeyCode)
{
if (KeyPressed != null)
KeyPressed(keyCode);
}
}
Subscriber:
void KeyPressedHandler(int keyCode)
{
...
}
...
Publisher publisher = new Publisher();
//register
publisher.KeyPressed = KeyPressedHandler; 一开始,你可以把KeyPressedDelegate当成是与函数指针相类似的东西,通过它你可以引用一个实例方法或静态方法,就好像引用一 个对象一样。然后可以通过这个delegate直接调用其引用的方法。但是下面你会看到delegate更扩大了其引用能力。
[1]
[2]
[3]
/* 336x280, 创建于 07-11-21 */
google_ad_slot = "0989131976";
google_ad_width = 336;
google_ad_height = 280;
//
事件驱动模型
事件驱动模型是软件系统平台中的一个重要区域,现代软件系统大量地使用事件驱动的处理方法 ,尤其在用户界面方面。虽然如此,过去在软件开发语言中一直没有融入事件处理的因子,直到.net的出现,才将事件处理的工作负荷一部分的分派给编译 器,从而稍微减轻开发者的负担。
下图显示事件模型的组成份子:
Subscriber需事先和publisher预订要接受其发布的某事件(下图a1),publisher在某事件发生以后 ,必需先生成该事件的相关数据对象(下图a2.1),然后通过方法调用来通知subscriber(下图a2.2),也就是用回调(callback)的方式来通知 subscriber。当然在预订的时候,并不一定要由subscriber自身来预订,也可以由另一个对象来帮忙预订。其动态图形示意如下:
本文并不探讨异步的信息传送,也就是在整个事件的处理过程当中,publisher和subscriber 对象皆 需要同时存在。如果对于离线(offline)的方式来处理事件有兴趣的话,请参阅Java的JMS(Java Message Service)和.NET的LCE(Loosely Coupled Events)。
事件是什么?
那么,到底事件是什么?在软件系统中要如何表达一个事件?一个事件应 该包括两个东西:识别事件的名称(event identity),和事件的相关的数据(event data)。例如,一个键盘按键被按下的事件可能叫KeyPressedEvent, 事件数据则为该按键的代码。
先前提到发布事件是用调用方法的方式(回调),不过有一个问题,就是publisher无法事先知道subscriber 的类型。在Java的编码模式当中,回调可以使用接口模式,也就是publisher必需事先定义好一个在发布事件中使用的接口,subscriber实现该接口中的方 法,publisher则通过调用接口中的方法来完成发布事件的工作。如下图:
这样,在Java的编码模式中,一个事件的识别名称就是接口名称和其中的方法名称,而事件数据则 自然是接口方法的参数了。Java对于这个接口的命名风格为XXXListener,顾名思义就是某事件的倾听者。例如:
public interface KeyListener extends EventListener {
public void keyTyped(KeyEvent e);
public void keyPressed(KeyEvent e);
public void keyReleased(KeyEvent e);
} 由于一个接口中可以包含多个方法,所以Java在设计事件的时候,是将一组相关联的事件放在一起, 这样设计的优点是可以很好的将事件做分类,并且在publisher中如果要处理的事件较多的话,可以使用比较少的成员变量来记录subscribers。缺点是如果 subscriber只对事件接口中的部分事件有兴趣,也必需要全盘实现该接口(所以在AWT里有java.awt.event.XXXAdapter抽象辅助类)。另一个缺点则是必需 要为每一类事件定义一个接口类型,即使可能大部分的事件只有极少的方法。
微软在为C#语言命名的时候,就刻意隐喻C#是从C/C 为基 础发展而得的面向对象程序语言,始祖绝不是Java,所以肯定要保留一些C/C 的语言机制。在C/C 里面对回调的设计方式就是用函数指针,想当然C#也希望直接使用类似函数调用的方式来做为事件发布的方法。如下图:
所以C#期望使用函数指针类型来作为事件的识别名称,然后用函数的参数来传递事件数据。我们先用一段C 代码来描绘这幅图画 :
Event type definition:
// 定义KeyPressedCallback 为一个函数指针的类型,
// 该函数接受一个整数型参数,无返回值
typedef void (*KeyPressedCallback)(int keyCode);
Publisher:
class Publisher
{
public KeyPressedCallback KeyPressedSink = null;
...
void FireEvent(int KeyCode)
{
if (KeyPressedSink != null)
(*KeyPressedSink)(keyCode);//callback
}
}
Subscriber:
void KeyPressedHandler(int keyCode)
{
...
}
...
Publisher publisher = new Publisher();
//reGISter
publisher.KeyPressedSink = &KeyPressedHandler; 一个当代的纯面向对象程序语言,是肯定希望要把造成程序复杂和不易维护的指针给去除的。所以在C#语言机制当中,势必要创造新的元素来取代, 于是delegate(委托)出现了。如下:
Event type definition:
// 定义KeyPressedDelegate 为一个类似函数指针的类型 ,
// 该函数接受一个整数型参数,无返回值
delegate void KeyPressedDelegate(int keyCode);
Publisher:
class Publisher
{
public KeyPressedDelegate KeyPressed = null;
...
void FireEvent(int KeyCode)
{
if (KeyPressed != null)
KeyPressed(keyCode);
}
}
Subscriber:
void KeyPressedHandler(int keyCode)
{
...
}
...
Publisher publisher = new Publisher();
//register
publisher.KeyPressed = KeyPressedHandler; 一开始,你可以把KeyPressedDelegate当成是与函数指针相类似的东西,通过它你可以引用一个实例方法或静态方法,就好像引用一 个对象一样。然后可以通过这个delegate直接调用其引用的方法。但是下面你会看到delegate更扩大了其引用能力。
[1]
[2]
[3]
相关文章推荐
- JAVA 与.NET 在前途上面的比较-Java基础-Java-编程开发
- 比较 .NET 和 Java-Java基础-Java-编程开发
- JAVA 和.NET在安全功能的比较-Java基础-Java-编程开发
- 学习使用J2EE Web应用的事件功能-Java基础-Java-编程开发
- 表现层框架Struts/Tapestry/JSF架构比较-Java基础-Java-编程开发
- .NET 和 Java 之碰撞火花:到底谁快?-Java基础-Java-编程开发
- 为Java应用程序添加退出事件响应-Java基础-Java-编程开发
- Java对战.NET,战争与和平的游戏-Java基础-Java-编程开发
- Java中对HashMap的深度分析与比较-Java基础-Java-编程开发
- Java源码分析:深入探讨Iterator模式-Java基础-Java-编程开发
- Java Web 框架的"甜点"-Java基础-Java-编程开发
- 在Java中处理日志记录-Java基础-Java-编程开发
- Web Service安全机制探讨-Java基础-Java-编程开发
- AJAX技术之如何处理书签和翻页按扭-Java基础-Java-编程开发
- 微软,您的.net为中国程序员带来了什么?-Java基础-Java-编程开发
- Java 图形界面编程 中三种事件处理方法之比较
- WEB开发技术比较报告-Java基础-Java-编程开发
- 该学Java或.NET?-Java基础-Java-编程开发
- 【转】F# 基础知识 - 面向 .NET 开发人员的功能性编程简介
- 编程基础知识——C/C++,Java,ObjC的回调方式探讨