快速业务通道

观察者模式的java实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

观察者模式的java实现

时间:2011-01-17 李庚睿

Java事件模型

在我的前两篇介绍C#事件和委托的blog 发表之后,大家响应特别热烈,点击率很高,看来事件/委托机制是很多同仁比较模糊的地方,借此东风,加上最近自己转战java,于是决定写这篇介绍java事件机制的blog。

其实,不管哪种语言的事件机制,毫无例外都逃不出三点:事件源/发送者,事件的接受者/处理者/侦听者,以及事件源向事件接受者传递的事件信息。对应在java中,事件源 (event source),事件倾听者 (event listener),事件消息称为eventobject。而在C#中,分别是发送者(Sender),处理者(handler),事件消息则是事件参数(EventArgument)。而java和c#都采用相同的响应模式:发布者/订阅者模式(publisher/subscriber),具体来说就是:

(1)订阅者向发布者注册自己感兴趣的事件;

(2)事件发生时,通知订阅者响应事件。

简单一句话,就是那句常说的:“Don''t call me,I''ll call you。”

由于之前已经对C#的事件机制进行了探讨,下面,我将着重谈谈java的事件机制,以及对两者实现机制的比较:

(一)Java事件实现机制

下面是一个自定义java事件的例子,通过这个简单的演示,你可以看到Java的事件实现机制。这里说明一下,这个例子引自http://www.rainsts.net/article.asp?id=224,为了说明原理,改编了原文中对匿名方法部分,而且由于这个网站的代码编辑器缺乏对java代码的支持,因此,对关键字,类型等并没有作格式显示处理。

import java.util.*; // 定义一个类似 C# EventArgs 的类用来传递事件状态信息。 // 一般要求继承自 java.util.EventObject,且以 Event 结尾。 class ClicktEvent extends EventObject {   public DemoBean source;   //构造函数的参数传递产生事件的事件源   public ClickEvent(DemoBean source)   {    super(source);    this.source = source;   } } // 通过接口来定义事件响应函数原型,就像c# delegate定义了响应函数的“模板”, // 别忘了,接口实际上就是一种“合同”,“契约”,通过这个接口中的函数签名达到对响应函数的规范 // 一般要求继承自 java.util.EventListener,且以 Listener 结尾。 //这里以I开头定义ClickListener接口,借鉴自.net,不符合j2ee的命名规范 interface IClickListener extends EventListener {   void click(ClicktEvent e); } //事件侦听者,实现侦听者接口 public class ClickListener implements IClickListener {    public void click(ClicktEvent e)   {     System.out.println( "the clicked event happened");    }  } // 定义演示控件类,也就是事件源 class DemoBean {  // 用一个java.util.Vector对象来存储所有的事件监听器对象。  private Vector clicks = new Vector();  // 添加事件订阅。一般以 add( listener)方式拼写,并添加 synchronized 关键字。  public synchronized void addExampleListener(IClickListener listener)  {   clicks.add(listener);  }  // 移除事件订阅。一般以 remove( listener)方式拼写,并添加 synchronized 关键字。  public synchronized void removeExampleListener(IClickListener listener)  {   clicks.remove(listener);  }  // 触发事件。  protected void doClickEvent()   {   // 锁定,避免在触发期间有事件被订阅或移除。   synchronized (this)    {    // 创建事件状态对象。    ClicktEvent ce = new ClickEvent(this);    // 循环触发所有的事件订阅方法。    for (int i = 0; i < clicks.size();

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号