java基本事件處理機制解析
基本事件處理機制分析
一、什么是事件處理機制?
事件處理機制中參與有三種角色:事件源、事件、事件監(jiān)聽者
- 事件源:產(chǎn)生事件的對象/組件
- 事件:事件源的狀態(tài)發(fā)生改變之后的對象,如鼠標操作、鍵盤操作等
- 事件監(jiān)聽者:負責(zé)監(jiān)聽事件的發(fā)生并處理事件
二、Action與ActionListener機制分析
Java GUI可以利用ActionListener進行ActionEvent的監(jiān)聽
其步驟如下:
- 事件監(jiān)聽者實現(xiàn)了接口ActionListener的類實例
- 事件源對象能夠添加監(jiān)聽器對象并向其發(fā)送事件對象
- 當(dāng)事件發(fā)生時,事件源將事件對象發(fā)送給添加的監(jiān)聽器
- 監(jiān)聽器對象對事件對象進行處理響應(yīng)
示例:
//actionlistener可以作為外部類、內(nèi)部類、匿名類進行監(jiān)聽,本示例使用內(nèi)部類 //兩個監(jiān)聽者對應(yīng)兩個button組件 private class bt1Handler implements ActionListener { public void actionPerformed(ActionEvent e) { jTextArea.setText("按鈕一點擊"); } } private class bt2Handler implements ActionListener { public void actionPerformed(ActionEvent e) { jTextArea.setText("按鈕二點擊"); } } //添加監(jiān)視器 bt1.addActionListener(bt1Handler); bt2.addActionListener(bt2Handler);
效果:
三、其他事件處理方式
(1)普通方法調(diào)用
它是一種阻塞式調(diào)用,例如A類中的方法a要調(diào)用B類中的方法b,必須要等待b方法執(zhí)行完畢才能執(zhí)行b方法之后的代碼,如果b方法執(zhí)行時間較長,整個過程就被阻塞在了這一步。
(2)回調(diào)函數(shù)
回調(diào)函數(shù)的概念十分簡單,就是將函數(shù)作為另一個函數(shù)的參數(shù),java中不允許方法作為參數(shù)們只能傳入類,然后調(diào)用類的方法,分為同步與異步回調(diào)函數(shù),下面分別實現(xiàn):
同步回調(diào):
//示例:我與朋友打電話讓他去我家吃飯,朋友同意 //Me類: public class Me implements callable { MyFriend friend; public Me( MyFriend friend){ this.friend=friend; } public void callFriend() throws Exception { System.out.println("開始執(zhí)行同步回調(diào)函數(shù)"); System.out.println("去我家吃飯"); friend.answer(this); System.out.println("開始執(zhí)行同步回調(diào)函數(shù)"); } @Override //回調(diào)函數(shù) public void call(){ System.out.println("好好好"); } } //MyFriend類: public class MyFriend { public void answer( callable callable) throws Exception{ System.out.println("接線中....."); callable.call(); } } //callable接口: public interface callable { public void call(); } //test類: public class testCallBack { public static void main(String[] args) throws Exception{ MyFriend friend=new MyFriend(); Me me=new Me(friend); me.callFriend(); } }
結(jié)果:
異步回調(diào):
//與同步回調(diào)區(qū)別是,回調(diào)函數(shù)單開一個線程,不影響和Me類等待回調(diào)函數(shù)執(zhí)行完成 public void callFriend() throws Exception { System.out.println("開始執(zhí)行異步回調(diào)函數(shù)"); new Thread(new Runnable() { @Override public void run() { try { System.out.println("去我家吃飯"); friend.answer(Me.this); } catch (Exception e) { e.printStackTrace(); } } }).start(); System.out.println("異步回調(diào)函數(shù)執(zhí)行完成"); }
結(jié)果:
(3)觀察者模式
所謂觀察者模式,其實是一種一對多的模式,有一個被觀察者以及多個觀察者,當(dāng)被觀察者的狀態(tài)發(fā)生變化時,觀察者可以收到相應(yīng)的信息。像我們平時訂閱一個微信公眾號或者是b站上關(guān)注一個up主,當(dāng)其發(fā)布新內(nèi)容時,你就會得知相應(yīng)的信息。
示例:
//你關(guān)注的up主更新了,并私信通知他的所有粉絲 //觀察者接口 public interface Observer { public void update(String video); } //具體觀察者(粉絲)類 public class Fan implements Observer{ private String name;//粉絲姓名 public Fan(String name){ this.name=name; } @Override public void update(String video){ System.out.println(name+"! "+video); } } //被觀察者接口 public interface UpLoader { //添加粉絲 void addFan(Fan fan); //刪除粉絲 void deleteFan(Fan fan); //通知粉絲 void informFan(String video); } //實現(xiàn)類 public class BilibliUpLoader implements UpLoader{ public String getName() { return name; } private String name; private List<Fan> fanList=new ArrayList<>(); public BilibliUpLoader(String name){ this.name=name; } @Override public void addFan(Fan fan) { fanList.add(fan); } @Override public void deleteFan(Fan fan) { fanList.remove(fan); } @Override public void informFan(String video) { for(Fan fan:fanList){ fan.update(video); } } } //測試類 public class test { public static void main(String[] args) { BilibliUpLoader bilibliUpLoader=new BilibliUpLoader("Mike"); Fan fan=new Fan("jack"); Fan fan1=new Fan("Bob"); Fan fan2=new Fan("Mary"); Fan fan3=new Fan("Lisa"); bilibliUpLoader.addFan(fan); bilibliUpLoader.addFan(fan1); bilibliUpLoader.addFan(fan2); bilibliUpLoader.addFan(fan3); bilibliUpLoader.informFan(bilibliUpLoader.getName()+"的新視頻來了"); } }
結(jié)果:
(4)幾種事件處理機制綜合比較
以上四種事件處理機制中可以分為兩類,普通方法調(diào)用為一類,其他三種為第二類:
抽象與解耦:
這三種事件處理方式利用接口將抽象類與實現(xiàn)類的耦合度降低,同時將接口充當(dāng)調(diào)用者與被調(diào)用者之間的第三者,通過接口盡可能減少不同類的依賴關(guān)系,盡可能增大數(shù)據(jù)耦合,從而降低耦合程度。
高內(nèi)聚:
后三鐘事件處理方式,將不同主體分開來(如觀察者與被觀察者),每個實體類專注于自身的職責(zé)(即單一原則)。
好處:
“高內(nèi)聚,低耦合”使得后面三種事件處理方式易于擴展、靈活性高、更易于維護與開發(fā),而普通的函數(shù)調(diào)用則不具備這些優(yōu)點。這也是面向接口編程的一大特點。
到此這篇關(guān)于java基本事件處理機制解析的文章就介紹到這了,更多相關(guān)java事件處理機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Netty網(wǎng)絡(luò)編程零基礎(chǔ)入門
Netty是一個異步的、基于事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護、高性能的網(wǎng)絡(luò)服務(wù)器和客戶端,如果你還不了解它的使用,就趕快繼續(xù)往下看吧2022-08-08

實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之整合Swagger2到通用模塊

聊聊Arrays.deepToString()和Arrays.toString()的區(qū)別

Struts2實現(xiàn)生成動態(tài)驗證碼并驗證實例代碼

Java9新特性對HTTP2協(xié)議支持與非阻塞HTTP?API