欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

淺談?dòng)胘ava實(shí)現(xiàn)事件驅(qū)動(dòng)機(jī)制

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

成都創(chuàng)新互聯(lián)公司主營(yíng)柏鄉(xiāng)網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),柏鄉(xiāng)h5微信平臺(tái)小程序開發(fā)搭建,柏鄉(xiāng)網(wǎng)站營(yíng)銷推廣歡迎柏鄉(xiāng)等地區(qū)企業(yè)咨詢

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

//定義事件和對(duì)應(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#實(shí)現(xiàn)的事件驅(qū)動(dòng)機(jī)制的一個(gè)簡(jiǎn)單的例子,可見是非常簡(jiǎn)單的,這都源于C#在語(yǔ)言層面(其實(shí)是CLR)提供的便利。遺憾的是Java并不提供這樣的便利,需要人為去實(shí)現(xiàn)。下面本文將提供兩種實(shí)現(xiàn)事件驅(qū)動(dòng)機(jī)制的方法,僅供參考。

觀察者模式

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

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

/*事件類*/
public Event {
  //與事件相關(guān)的事件處理函數(shù)
  public ArrayList<Callback> callbackList;
  
  //事件觸發(fā)函數(shù)
  public void emit(){
    for(Callback cb : callbackList){
      cb.run();
    }
  }
  
  //注冊(cè)事件處理函數(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!");
  }
  
  
/*實(shí)現(xiàn)事件驅(qū)動(dòng)*/
Event e = new Event(); 
//將OnClick事件處理函數(shù)注冊(cè)到事件中
e.registerCallback(new OnClick()); 
//觸發(fā)事件
e.emit();

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

利用反射

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

/*事件處理類*/
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!");
  }
}
  
  
/*實(shí)現(xiàn)事件驅(qū)動(dòng)機(jī)制*/
Button b = new Button();
if(/*收到按鈕點(diǎn)擊信號(hào)*/){
  EventHandler e = new EventHandler(b, "onClick");
  e.emit();
}

上述代碼展示了利用反射實(shí)現(xiàn)的事件驅(qū)動(dòng)機(jī)制,利用反射機(jī)制的好處是其具有強(qiáng)大的擴(kuò)展性,比如我的事件處理函數(shù)中可以引入一個(gè)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();
  }
}

是不是似曾相識(shí)?沒錯(cuò),和用C#寫Winform窗體時(shí),Visual studio為你自動(dòng)生成的事件處理函數(shù)(代碼中的onClick函數(shù))幾乎具有完全相同的形式,但此時(shí)我們是用Java實(shí)現(xiàn)的。

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

分享題目:淺談?dòng)胘ava實(shí)現(xiàn)事件驅(qū)動(dòng)機(jī)制
瀏覽路徑:http://aaarwkj.com/article12/pcdggc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、定制網(wǎng)站、網(wǎng)站制作、企業(yè)網(wǎng)站制作企業(yè)建站、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
成人爱爱免费观看视频| 字幕日本欧美一区二区| 国产亚洲av综合人人精品| 日韩视频专区一区二区| 国产麻豆精品传媒av| 美女诱惑福利视频久久久| 日韩人妻av免费电影| 国产女人和拘做受视频| 精品国产一区二区三级四区| 在线看黄视频网站永久免费| 日韩高清一级黄色大片网站| 在线观看国产一区二区不卡| 黄片大全视频在线免费观看| 亚洲精品麻豆一区二区| 亚洲精品午夜久久久伊人| 欧美日韩在线亚洲二区综二| 高潮内射一区二区三区| 91日韩中文字幕在线观看| 日本免费的高清一区二区| 中文字幕人妻久久一区| 国产欧美日韩另类视频| 免费在线观看av日韩| av成熟一区二区三区| 日本免费一区中文字幕| 国产手机在线91精品观看| 一区二区三区毛片av网站| 最新91精品国产自产在线| 六十路人妻一区二区三区| 亚洲中文字幕少妇视频| 亚洲免费成人一区二区| 欧美另类亚洲日本一区二区| 熟女一区二区中文字幕| 久久精品国产亚洲av高清综合| 中日中文av一区二区三区| 人妻少妇性色精品专区av| 91久久福利国产成人精品| 亚洲偷拍自拍在线观看| 国产又大又爽免费视频| 日韩欧美亚洲综合另类| 偷拍偷窥女厕一区二区视频| 女厕所偷拍一区二区三区|