\在程序中可见事件源Model类显式地调用了接口中的modelChanged方法实际是把事件状态对象e作为参数传递给了监听者类中的modelChanged方法
适配类
适配类是Java事件模型中极其重要的一部分在一些应用场合事件从源到监听者之间的传递要通过适配类来转发例如当事件源发出一个事件而有几个事件监听者对象都可接收该事件但只有指定对象做出反应时就要在事件源与事件监听者之间插入一个事件适配器类由适配器类来指定事件应该是由哪些监听者来响应适配类成为了事件监听者事件源实际是把适配类作为监听者注册入监听者队列中而真正的事件响应者并未在监听者队列中事件响应者应做的动作由适配类决定目前绝大多数的开发工具在生成代码时事件处理都是通过适配类来进行的
C#事件处理
在NET应用程序开发中不管是WEB Forms(ASPNET)还是Windows Forms都涉及到大量对象的事件响应及处理比如客户在线提交一份订单或是在Windows窗口上移动鼠标等都将有事件发生那么在C#中是怎样声明事件并为事件添加响应方法的呢?
在C#中事件(Events)成员就是用来声明一个类事件的在类中声明一个事件成员一般采用如下的语法形式
public event 代表名 事件名
如在Control类中声明了一个Click事件成员其语法如下
public event EventHandler Click;
在C#中增加了一个新的数据类型delegate来解决事件处理问题代表数据类型非常类似于C语言中的指针其与指针不同的是其是代码是安全的可管理的由于C#本身的简易性对于没有使用过C及指针的程序来说理解delegate也是非常容易的
在C#中通过使用delegate你可以通过+=操作符非常容易地为Net对象中的一个事件添加一个甚至多个响应方法还可以通过非常简单的=操作符取消这些响应方法如下面为temp按钮添加Click事件的语句
tempClick+=new SystemEventHandler(thisTest);//为test添加事件处理方法
在上面声明事件的语句中Eventhandler是一个delegate(代表)类型其在Net类库中如下声明的
public delegate void EventHandler(object senderEventArgs e);
这样所有形如:void 函娄名(object 参数名EventArgs 参数名);的函数都可以作为Control类的Click事件响应方法了如下面所定义的一个事件响应方法
private void button_Click(object sender SystemEventArgs e)
由于是通过delegate来处理事件因此可能通过累加使一个事件具有多个响应方法与此同时还可以使一个方法作为多个事件的响应方法(注意在C#语言类中的event成员后面只能出现+=与=两个表示添加与取消事件响应函数的操作符)不管是ASPNet还是一般的Windows Forms 编程在C#中基本上我们遇到的事件响应方法都是说明成如下的形式
private void button_Click(object sender SystemEventArgs e)
那么一个事件响应方法的存取权限返回值类型参数及类型甚至方法名称等是否都必须固定不变呢?答案是不是!
一般情况下事件的响应方法中都有两个参数其中一个代表引发事件的对象即sender由于引发事件的对象不可预知的因此我们把其声明成为object类型所有的对象都适用第二个参数代表引发事件的具体信息各种类型的事件中可能不同这要根据类中事件成员的说明决定
我们知道事件是通过delegate来处理的假设将要表示事件说明成如下形式
delegate int MyEventHandler(object sender ToolBarButtonClickEventArgs e);
则当涉及上面的事件响应函数声明时就须要声明成如下的形式
private int MyTest(object senderToolBarButtonClickEventArgs e) {}
在给对象添加事件响应方法时就可以用如下的代码实现
ControlEvent+=new MyEventHandler(MyTest);
总的来说Java事件处理更直接简单而C#事件处理由于引用代理使得程序更灵活更体现程序之间的松藕合性美国神鸟(Stryon http://wwwstryoncomcn)公司宣布在Java开发平台上实现微软的NET命名为iNET并于近期推出iNET的Beta版本其中就包括用Java实现了C#的三级事件处理机制