Java設(shè)計模式的事件模型詳解
監(jiān)聽模式
事件模型實現(xiàn)了監(jiān)聽模式,監(jiān)聽模式簡單來說就是事件源經(jīng)過事件的封裝傳給監(jiān)聽器,當(dāng)事件源觸發(fā)事件后,監(jiān)聽器接收到事件對象可以回調(diào)事件的方法。
參與的角色
事件模型有三種角色參與,分別是:事件源、事件、事件監(jiān)聽器。
事件
事件繼承自java.util.EventObject
類,封裝了事件源對象及跟事件相關(guā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ā)生的地方,由于事件源的某項屬性或狀態(tài)發(fā)生了改變,
例如鼠標點擊事件。
事件監(jiān)聽器
事件監(jiān)聽器實現(xiàn)java.util.EventListener
接口,注冊在事件源上,當(dāng)事件源的屬性或狀態(tài)改變時,取得相應(yīng)的監(jiān)聽器調(diào)用其內(nèi)部的回調(diào)方法。最簡單的代碼,沒有之一。
package java.util; public interface EventListener { }
事件、事件源、監(jiān)聽器之間的關(guān)系
首先產(chǎn)生一個事件源(EventSource),然后事件(EventObject)封裝事件源信息和事件信息,事件發(fā)生,事件源注冊監(jiān)聽器,通知監(jiā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 + "]"; } }
事件對象Event繼承EventObject,封裝了事件源
import java.util.EventObject; public class Event extends EventObject { public Event(Object source) { super(source); } }
事件源,事件源注冊了事件監(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); }
測試
public class Test { public static void main(String[] args) { Source source = new Source(); source.setName("鼠標點擊"); System.out.println(source.getName()); source.registerEventListener((event) -> {//這里是處理邏輯 System.out.println("鼠標事件回調(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攔截的實現(xiàn)示例
本文主要介紹了spring 重復(fù)注解和aop攔截的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08Map按單個或多個Value排序當(dāng)Value相同時按Key排序
Map可以先按照value進行排序,然后按照key進行排序。 或者先按照key進行排序,然后按照value進行排序,這樣操作都行,這篇文章主要介紹了Map按單個或多個Value排序,當(dāng)Value相同時按Key排序,需要的朋友可以參考下2023-02-02Java Swing中的文本區(qū)(JTextArea)實現(xiàn)換行保存到文件的幾個方法
這篇文章主要介紹了Java Swing中的文本區(qū)(JTextArea)實現(xiàn)換行保存到文件的幾個方法,本文給出了4種方法,需要的朋友可以參考下2014-10-10Spring Boot中單例類實現(xiàn)對象的注入方式
這篇文章主要介紹了Spring Boot中單例類實現(xiàn)對象的注入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08