全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈用java实现事件驱动机制

由于项目需求,需要为Java提供一套支持事件驱动机制的类库,可以实现类似于C#中的event和delegate机制。众所周知,Java语言本身以及其标准库中并没有提供事件驱动机制的相关接口,虽然Swing(我且认为其不属于标准库,因为一般没人用:)中存在相关的类支持该机制以实现组件的事件处理,但它毕竟是与GUI相耦合的,而在其它类型的应用程序中使用起来显得就有些别扭,缺乏通用性。因此有必要实现一套通用的Java事件驱动机制类库,然后将其应用于通用的Java应用程序当中,虽然这并不是什么难事:)

让我们先考察一下C#的事件驱动机制编写方法。C#中提供的event关键字可以很容易的用来定义一个事件,然后通过向事件中添加事件处理函数(在C#中一般用委托(delegate)来引用一个函数),触发事件就可以调用相关的处理函数,也即是事件驱动的过程。例如:

//定义事件和对应的委托
public event MyDelegate Click;
public delegate void MyDelegate();

//定义委托
void OnClick(){
  console.writeline("you just clicked me!");
}

//将委托与事件关联
Click += OnClick;

//触发事件
Click();

上面的代码就是用C#实现的事件驱动机制的一个简单的例子,可见是非常简单的,这都源于C#在语言层面(其实是CLR)提供的便利。遗憾的是Java并不提供这样的便利,需要人为去实现。下面本文将提供两种实现事件驱动机制的方法,仅供参考。

观察者模式

观察者模式是一种常用的设计模式,观察者(Observer)先通过订阅被观察对象(Subject),这样一旦被观察者(Subject)发生某种变化,就会将变化通知观察者(Observer)。

这种设计模式刚好可以用于事件驱动机制,事件(event)相当于被观察对象(Subject),一旦事件被触发,就会调用事件处理函数,可见事件处理函数(C#中的委托)可以看作是观察者。因此可以像如下这样实现上文中的功能。

/*事件类*/
public Event {
  //与事件相关的事件处理函数
  public ArrayList<Callback> callbackList;
  
  //事件触发函数
  public void emit(){
    for(Callback cb : callbackList){
      cb.run();
    }
  }
  
  //注册事件处理函数
  public registerCallback(Callback cb){
    callbackList.add(cb);
  }
}

/*事件处理函数类*/
public interface Callback {
  void run();
}

public OnClick implements Callback {
  //函数
  public void run(){
    System.out.println("you just clicked me!");
  }
  
  
/*实现事件驱动*/
Event e = new Event(); 
//将OnClick事件处理函数注册到事件中
e.registerCallback(new OnClick()); 
//触发事件
e.emit();

上面的Java代码实现了一种简单的事件驱动机制,原理很简单,是一种典型的观察者模式的应用案例。

利用反射

Java语言提供强大的反射功能,可以在运行时获取类的各个组成部分(比如类名、类成员函数、类属性等等)并对其进行操作。下面使用反射来实现简单的事件驱动机制。

/*事件处理类*/
public class EventHandler {
  //事件源
  private Object sender;
  //事件处理函数名称(用于反射)
  private String callback;
  
  public EventHandler(Object sender, String callback){
    this.sender = sender;
    this.callback = callback;
  }
  
  //事件触发
  public void emit(){
  Class senderType = this.sender.getClass();
  try {
    //获取并调用事件源sender的事件处理函数
    Method method = senderType.getMethod(this.callback);
    method.invoke(this.sender);
    } catch (Exception e2) {
      e2.printStackTrace();
    }
  }
}


/*事件源*/
public class Button(){
  /*可以在此设置Button类的相关属性,比如名字等*/
  private String name;
  ...
  
  
  //事件处理函数
  public void onClick(){
    System.out.println("you just clicked me!");
  }
}
  
  
/*实现事件驱动机制*/
Button b = new Button();
if(/*收到按钮点击信号*/){
  EventHandler e = new EventHandler(b, "onClick");
  e.emit();
}

上述代码展示了利用反射实现的事件驱动机制,利用反射机制的好处是其具有强大的扩展性,比如我的事件处理函数中可以引入一个EventArgs的形参,从而可以让事件本身带有参数,这样就可以让事件携带更多的信息,改写后的事件处理函数如下方的代码所示:

public class EventArgs {
  //参数
  String p1;
  Integer p2;
  ...
  
}

//onClick事件处理函数改写
public void onClick(Object sender, EventArgs e){
  //参数e提供更多的信息
  System.out.println("Hello, you clicked me! " + e.p1 + e.p2);
}

//触发函数emit改写
public void emit(EventArgs e){
Class senderType = this.sender.getClass();
try {
  //获取并调用事件源sender的事件处理函数
  Method method = senderType.getMethod(this.callback, this.getClass(), e.getClass());
  method.invoke(this.sender, this.sender, e);
  } catch (Exception e2) {
    e2.printStackTrace();
  }
}

是不是似曾相识?没错,和用C#写Winform窗体时,Visual studio为你自动生成的事件处理函数(代码中的onClick函数)几乎具有完全相同的形式,但此时我们是用Java实现的。

当然,除了以上提到的两种方法可以实现Java的事件驱动机制以外,还有一些其它的方法,比如可以利用Java的内部类来实现,笔者也曾写过一些示例代码,这里就不再冗言了,留待以后再讲。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java事件处理机制  # java的事件处理机制  # 详解JAVA Spring 中的事件机制  # Java事件机制要素及实例详解  # Java事件监听机制讲解  # 详谈Java中的事件监听机制  # 一文带你学会Java事件机制  # 是一种  # 两种  # 可以实现  # 来实现  # 就可以  # 应用程序  # 的是  # 类库  # 就会  # 让我们  # 在此  # 为你  # 没人  # 而在  # 将其  # 很容易  # 对其  # 很简单  # 事件中  # 为其 


相关文章: 商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  非常酷的网站设计制作软件,酷培ai教育官方网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何选择高效响应式自助建站源码系统?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在新浪SAE免费搭建个人博客?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站之星免费模板:自助建站系统与智能响应式一键生成  制作网站的基本流程,设计网站的软件是什么?  如何在云主机上快速搭建多站点网站?  建站之星如何快速生成多端适配网站?  如何零基础在云服务器搭建WordPress站点?  javascript基本数据类型及类型检测常用方法小结  英语简历制作免费网站推荐,如何将简历翻译成英文?  建站之星如何助力企业快速打造五合一网站?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  已有域名和空间,如何快速搭建网站?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  微课制作网站有哪些,微课网怎么进?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  制作网站公司那家好,网络公司是做什么的?  html制作网站的步骤有哪些,iapp如何添加网页?  制作农业网站的软件,比较好的农业网站推荐一下?  安徽网站建设与外贸建站服务专业定制方案  C++时间戳转换成日期时间的步骤和示例代码  制作网站怎么制作,*游戏网站怎么搭建?  建站之星ASP如何实现CMS高效搭建与安全管理?  如何设计高效校园网站?  深圳网站制作案例,网页的相关名词有哪些?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  建站之星后台管理如何实现高效配置?  教程网站设计制作软件,怎么创建自己的一个网站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  *服务器网站为何频现安全漏洞?  已有域名如何免费搭建网站?  如何在IIS中新建站点并配置端口与物理路径?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  宿州网站制作公司兴策,安徽省低保查询网站?  建站之星如何保障用户数据免受黑客入侵?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何正确选择百度移动适配建站域名?  建站之家VIP精选网站模板与SEO优化教程整合指南  建站之星在线版空间:自助建站+智能模板一键生成方案 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。