激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談用java實現(xiàn)事件驅動機制

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

2020-12-26 14:52關注歌聲楚楚 Java教程

這篇文章主要介紹了淺談用java實現(xiàn)事件驅動機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

java" id="highlighter_609123">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//定義事件和對應的委托
public event MyDelegate Click;
public delegate void MyDelegate();
 
//定義委托
void OnClick(){
  console.writeline("you just clicked me!");
}
 
//將委托與事件關聯(lián)
Click += OnClick;
 
//觸發(fā)事件
Click();

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

觀察者模式

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*事件類*/
public Event {
  //與事件相關的事件處理函數(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)事件驅動*/
Event e = new Event();
//將OnClick事件處理函數(shù)注冊到事件中
e.registerCallback(new OnClick());
//觸發(fā)事件
e.emit();

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

利用反射

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*事件處理類*/
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 {
    //獲取并調用事件源sender的事件處理函數(shù)
    Method method = senderType.getMethod(this.callback);
    method.invoke(this.sender);
    } catch (Exception e2) {
      e2.printStackTrace();
    }
  }
}
 
 
/*事件源*/
public class Button(){
  /*可以在此設置Button類的相關屬性,比如名字等*/
  private String name;
  ...
  
  
  //事件處理函數(shù)
  public void onClick(){
    System.out.println("you just clicked me!");
  }
}
  
  
/*實現(xiàn)事件驅動機制*/
Button b = new Button();
if(/*收到按鈕點擊信號*/){
  EventHandler e = new EventHandler(b, "onClick");
  e.emit();
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 {
  //獲取并調用事件源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)的。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.jianshu.com/p/ccd468c6be8a

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 9999视频| 一级黄色av电影 | 中文日韩在线视频 | 日本在线播放一区 | 久久久久久久久浪潮精品 | 色婷婷久久一区二区 | 成年人黄色片视频 | 日本精品一区二区 | 亚洲欧美国产高清va在线播放 | 亚洲影院在线播放 | 在线观看视频亚洲 | 日韩视频高清 | 久久成人免费网站 | av之家在线观看 | 一级做a爱性色毛片免费1 | 亚洲欧美日韩精品久久亚洲区色播 | 综合精品一区 | 美女亚洲综合 | 亚洲天堂ww | 国产午夜精品视频免费不卡69堂 | 男女隐私免费视频 | 91网站链接| 欧美成人免费在线视频 | 高清国产一区二区三区四区五区 | 国产日韩免费观看 | 午夜视频亚洲 | 久久美女色视频 | 亚洲欧美aⅴ | 万圣街在线观看免费完整版 | 久久国产精品区 | 人人舔人人插 | 女教师~淫辱の动漫在线 | 久久草在线视频免费 | 极品xxxx欧美一区二区 | 97中文| 久久国产91 | 九九热在线观看视频 | 国产女厕一区二区三区在线视 | 91精品国产乱码久久桃 | 一区二区三区无码高清视频 | 久久精品资源 |