最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談用java實現(xiàn)事件驅(qū)動機制

 更新時間:2017年09月04日 17:23:30   作者:關(guān)注歌聲楚楚  
這篇文章主要介紹了淺談用java實現(xiàn)事件驅(qū)動機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

由于項目需求,需要為Java提供一套支持事件驅(qū)動機制的類庫,可以實現(xiàn)類似于C#中的event和delegate機制。眾所周知,Java語言本身以及其標(biāo)準(zhǔn)庫中并沒有提供事件驅(qū)動機制的相關(guān)接口,雖然Swing(我且認(rèn)為其不屬于標(biāo)準(zhǔn)庫,因為一般沒人用:)中存在相關(guān)的類支持該機制以實現(xiàn)組件的事件處理,但它畢竟是與GUI相耦合的,而在其它類型的應(yīng)用程序中使用起來顯得就有些別扭,缺乏通用性。因此有必要實現(xiàn)一套通用的Java事件驅(qū)動機制類庫,然后將其應(yīng)用于通用的Java應(yīng)用程序當(dāng)中,雖然這并不是什么難事:)

讓我們先考察一下C#的事件驅(qū)動機制編寫方法。C#中提供的event關(guān)鍵字可以很容易的用來定義一個事件,然后通過向事件中添加事件處理函數(shù)(在C#中一般用委托(delegate)來引用一個函數(shù)),觸發(fā)事件就可以調(diào)用相關(guān)的處理函數(shù),也即是事件驅(qū)動的過程。例如:

//定義事件和對應(yīng)的委托
public event MyDelegate Click;
public delegate void MyDelegate();

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

//將委托與事件關(guān)聯(lián)
Click += OnClick;

//觸發(fā)事件
Click();

上面的代碼就是用C#實現(xiàn)的事件驅(qū)動機制的一個簡單的例子,可見是非常簡單的,這都源于C#在語言層面(其實是CLR)提供的便利。遺憾的是Java并不提供這樣的便利,需要人為去實現(xiàn)。下面本文將提供兩種實現(xiàn)事件驅(qū)動機制的方法,僅供參考。

觀察者模式

觀察者模式是一種常用的設(shè)計模式,觀察者(Observer)先通過訂閱被觀察對象(Subject),這樣一旦被觀察者(Subject)發(fā)生某種變化,就會將變化通知觀察者(Observer)。

這種設(shè)計模式剛好可以用于事件驅(qū)動機制,事件(event)相當(dāng)于被觀察對象(Subject),一旦事件被觸發(fā),就會調(diào)用事件處理函數(shù),可見事件處理函數(shù)(C#中的委托)可以看作是觀察者。因此可以像如下這樣實現(xiàn)上文中的功能。

/*事件類*/
public Event {
  //與事件相關(guān)的事件處理函數(shù)
  public ArrayList<Callback> callbackList;
  
  //事件觸發(fā)函數(shù)
  public void emit(){
    for(Callback cb : callbackList){
      cb.run();
    }
  }
  
  //注冊事件處理函數(shù)
  public registerCallback(Callback cb){
    callbackList.add(cb);
  }
}

/*事件處理函數(shù)類*/
public interface Callback {
  void run();
}

public OnClick implements Callback {
  //函數(shù)
  public void run(){
    System.out.println("you just clicked me!");
  }
  
  
/*實現(xiàn)事件驅(qū)動*/
Event e = new Event(); 
//將OnClick事件處理函數(shù)注冊到事件中
e.registerCallback(new OnClick()); 
//觸發(fā)事件
e.emit();

上面的Java代碼實現(xiàn)了一種簡單的事件驅(qū)動機制,原理很簡單,是一種典型的觀察者模式的應(yīng)用案例。

利用反射

Java語言提供強大的反射功能,可以在運行時獲取類的各個組成部分(比如類名、類成員函數(shù)、類屬性等等)并對其進行操作。下面使用反射來實現(xiàn)簡單的事件驅(qū)動機制。

/*事件處理類*/
public class EventHandler {
  //事件源
  private Object sender;
  //事件處理函數(shù)名稱(用于反射)
  private String callback;
  
  public EventHandler(Object sender, String callback){
    this.sender = sender;
    this.callback = callback;
  }
  
  //事件觸發(fā)
  public void emit(){
  Class senderType = this.sender.getClass();
  try {
    //獲取并調(diào)用事件源sender的事件處理函數(shù)
    Method method = senderType.getMethod(this.callback);
    method.invoke(this.sender);
    } catch (Exception e2) {
      e2.printStackTrace();
    }
  }
}


/*事件源*/
public class Button(){
  /*可以在此設(shè)置Button類的相關(guān)屬性,比如名字等*/
  private String name;
  ...
  
  
  //事件處理函數(shù)
  public void onClick(){
    System.out.println("you just clicked me!");
  }
}
  
  
/*實現(xiàn)事件驅(qū)動機制*/
Button b = new Button();
if(/*收到按鈕點擊信號*/){
  EventHandler e = new EventHandler(b, "onClick");
  e.emit();
}

上述代碼展示了利用反射實現(xiàn)的事件驅(qū)動機制,利用反射機制的好處是其具有強大的擴展性,比如我的事件處理函數(shù)中可以引入一個EventArgs的形參,從而可以讓事件本身帶有參數(shù),這樣就可以讓事件攜帶更多的信息,改寫后的事件處理函數(shù)如下方的代碼所示:

public class EventArgs {
  //參數(shù)
  String p1;
  Integer p2;
  ...
  
}

//onClick事件處理函數(shù)改寫
public void onClick(Object sender, EventArgs e){
  //參數(shù)e提供更多的信息
  System.out.println("Hello, you clicked me! " + e.p1 + e.p2);
}

//觸發(fā)函數(shù)emit改寫
public void emit(EventArgs e){
Class senderType = this.sender.getClass();
try {
  //獲取并調(diào)用事件源sender的事件處理函數(shù)
  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為你自動生成的事件處理函數(shù)(代碼中的onClick函數(shù))幾乎具有完全相同的形式,但此時我們是用Java實現(xiàn)的。

當(dāng)然,除了以上提到的兩種方法可以實現(xiàn)Java的事件驅(qū)動機制以外,還有一些其它的方法,比如可以利用Java的內(nèi)部類來實現(xiàn),筆者也曾寫過一些示例代碼,這里就不再冗言了,留待以后再講。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實現(xiàn)人員信息管理系統(tǒng)

    java實現(xiàn)人員信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)人員信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java動態(tài)代理之?dāng)r截器的應(yīng)用

    Java動態(tài)代理之?dāng)r截器的應(yīng)用

    今天小編就為大家分享一篇關(guān)于Java動態(tài)代理之?dāng)r截器的應(yīng)用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 什么是Spring Boot

    什么是Spring Boot

    Spring是一個非常受歡迎的Java框架,它用于構(gòu)建web和企業(yè)應(yīng)用。本文介紹將各種Spring的配置方式,幫助您了解配置Spring應(yīng)用的復(fù)雜性
    2017-08-08
  • Java Fluent Mybatis實戰(zhàn)之構(gòu)建項目與代碼生成篇下

    Java Fluent Mybatis實戰(zhàn)之構(gòu)建項目與代碼生成篇下

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國內(nèi)又以Mybatis用的多,基于mybatis上的增強框架,又有mybatis plus和TK mybatis等。今天我們介紹一個新的mybatis增強框架 fluent mybatis
    2021-10-10
  • 五分鐘帶你了解Java的接口數(shù)據(jù)校驗

    五分鐘帶你了解Java的接口數(shù)據(jù)校驗

    這篇文章主要介紹了五分鐘帶你了解Java的接口數(shù)據(jù)校驗,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java Split 實現(xiàn)去除一個空格和多個空格

    java Split 實現(xiàn)去除一個空格和多個空格

    這篇文章主要介紹了java Split 實現(xiàn)去除一個空格和多個空格,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • springdoc?openapi使用解決方案

    springdoc?openapi使用解決方案

    SpringDoc注解的使用,它是基于OpenAPI?3和Swagger?3的現(xiàn)代化解決方案,相較于舊版的Swagger2即SpringFox,SpringDoc提供了更簡潔、更直觀的注解方式,這篇文章主要介紹了springdoc?openapi使用,需要的朋友可以參考下
    2024-04-04
  • 淺談maven的jar包和war包區(qū)別 以及打包方法

    淺談maven的jar包和war包區(qū)別 以及打包方法

    下面小編就為大家分享一篇淺談maven的jar包和war包區(qū)別 以及打包方法,具有很好的參考價值,希望對大家有所幫助
    2017-11-11
  • Java實現(xiàn)學(xué)生信息管理系統(tǒng)超詳細(xì)教程

    Java實現(xiàn)學(xué)生信息管理系統(tǒng)超詳細(xì)教程

    這篇文章主要介紹了一個簡單的Java學(xué)生信息管理系統(tǒng),使用ArrayList集合存儲學(xué)生對象信息,并實現(xiàn)了添加、刪除、修改和查看學(xué)生信息的功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Quarkus篇入門創(chuàng)建項目搭建debug環(huán)境

    Quarkus篇入門創(chuàng)建項目搭建debug環(huán)境

    這篇文章主要為大家介紹了Quarkus篇入門創(chuàng)建項目搭建debug環(huán)境,先來一套hello?world,來搭建基本的運行及調(diào)試環(huán)境吧
    2022-02-02

最新評論

通河县| 石嘴山市| 喀什市| 句容市| 加查县| 哈密市| 永昌县| 包头市| 松原市| 白玉县| 贵州省| 霍林郭勒市| 黎川县| 元阳县| 科技| 高邑县| 大洼县| 徐汇区| 全南县| 邢台市| 昭通市| 仁寿县| 昌邑市| 乌拉特后旗| 托克逊县| 库车县| 青岛市| 濉溪县| 通州市| 孟连| 册亨县| 平邑县| 吉林省| 茂名市| 体育| 商城县| 滨海县| 喀什市| 万荣县| 宣威市| 拜城县|