Java設(shè)計(jì)模式的事件模型詳解
監(jiān)聽模式
事件模型實(shí)現(xiàn)了監(jiān)聽模式,監(jiān)聽模式簡(jiǎn)單來說就是事件源經(jīng)過事件的封裝傳給監(jiān)聽器,當(dāng)事件源觸發(fā)事件后,監(jiān)聽器接收到事件對(duì)象可以回調(diào)事件的方法。
參與的角色
事件模型有三種角色參與,分別是:事件源、事件、事件監(jiān)聽器。
事件
事件繼承自java.util.EventObject
類,封裝了事件源對(duì)象及跟事件相關(guān)的信息,代碼可以說是很簡(jiǎn)單了。
public class EventObject implements java.io.Serializable { /** * 事件源 */ protected transient Object source; public EventObject(Object source) { if (source == null) throw new IllegalArgumentException("null source"); this.source = source; } public Object getSource() { return source; } public String toString() { return getClass().getName() + "[source=" + source + "]"; } }
事件源
事件源是事件發(fā)生的地方,由于事件源的某項(xiàng)屬性或狀態(tài)發(fā)生了改變,
例如鼠標(biāo)點(diǎn)擊事件。
事件監(jiān)聽器
事件監(jiān)聽器實(shí)現(xiàn)java.util.EventListener
接口,注冊(cè)在事件源上,當(dāng)事件源的屬性或狀態(tài)改變時(shí),取得相應(yīng)的監(jiān)聽器調(diào)用其內(nèi)部的回調(diào)方法。最簡(jiǎn)單的代碼,沒有之一。
package java.util; public interface EventListener { }
事件、事件源、監(jiān)聽器之間的關(guān)系
首先產(chǎn)生一個(gè)事件源(EventSource),然后事件(EventObject)封裝事件源信息和事件信息,事件發(fā)生,事件源注冊(cè)監(jiān)聽器,通知監(jiān)聽器,監(jiān)聽器處理事件。
舉個(gè)粒子
事件對(duì)象
public class EventObject implements java.io.Serializable { /** * 事件源 */ protected transient Object source; public EventObject(Object source) { if (source == null) throw new IllegalArgumentException("null source"); this.source = source; } public Object getSource() { return source; } public String toString() { return getClass().getName() + "[source=" + source + "]"; } }
事件對(duì)象Event繼承EventObject,封裝了事件源
import java.util.EventObject; public class Event extends EventObject { public Event(Object source) { super(source); } }
事件源,事件源注冊(cè)了事件監(jiān)聽器
import java.util.HashSet; import java.util.Set; public class Source { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } private final Set<Listener> listenerSet = new HashSet<>(); public void registerEventListener(Listener eventListener) { if (eventListener != null) { listenerSet.add(eventListener); } } public void handle() { for (Listener eventListener : listenerSet) { Event event = new Event(this); eventListener.callback(event); } } }
事件監(jiān)聽器
import java.util.EventListener; public interface Listener extends EventListener { void callback(Event e); }
測(cè)試
public class Test { public static void main(String[] args) { Source source = new Source(); source.setName("鼠標(biāo)點(diǎn)擊"); System.out.println(source.getName()); source.registerEventListener((event) -> {//這里是處理邏輯 System.out.println("鼠標(biāo)事件回調(diào)被執(zhí)行了---"); System.out.println("當(dāng)前線程名稱:"+Thread.currentThread().getName()); }); source.handle(); } }
執(zhí)行結(jié)果
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例
本文主要介紹了spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05Map按單個(gè)或多個(gè)Value排序當(dāng)Value相同時(shí)按Key排序
Map可以先按照value進(jìn)行排序,然后按照key進(jìn)行排序。 或者先按照key進(jìn)行排序,然后按照value進(jìn)行排序,這樣操作都行,這篇文章主要介紹了Map按單個(gè)或多個(gè)Value排序,當(dāng)Value相同時(shí)按Key排序,需要的朋友可以參考下2023-02-02Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法
這篇文章主要介紹了Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法,本文給出了4種方法,需要的朋友可以參考下2014-10-10java模擬實(shí)現(xiàn)銀行ATM機(jī)操作
這篇文章主要為大家詳細(xì)介紹了java模擬實(shí)現(xiàn)銀行ATM機(jī)操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Spring Boot中單例類實(shí)現(xiàn)對(duì)象的注入方式
這篇文章主要介紹了Spring Boot中單例類實(shí)現(xiàn)對(duì)象的注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08