Java設(shè)計模式的事件模型詳解
監(jiān)聽模式
事件模型實現(xiàn)了監(jiān)聽模式,監(jiān)聽模式簡單來說就是事件源經(jīng)過事件的封裝傳給監(jiān)聽器,當事件源觸發(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接口,注冊在事件源上,當事件源的屬性或狀態(tài)改變時,取得相應的監(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("當前線程名稱:"+Thread.currentThread().getName());
});
source.handle();
}
}
執(zhí)行結(jié)果

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Map按單個或多個Value排序當Value相同時按Key排序
Map可以先按照value進行排序,然后按照key進行排序。 或者先按照key進行排序,然后按照value進行排序,這樣操作都行,這篇文章主要介紹了Map按單個或多個Value排序,當Value相同時按Key排序,需要的朋友可以參考下2023-02-02
Java Swing中的文本區(qū)(JTextArea)實現(xiàn)換行保存到文件的幾個方法
這篇文章主要介紹了Java Swing中的文本區(qū)(JTextArea)實現(xiàn)換行保存到文件的幾個方法,本文給出了4種方法,需要的朋友可以參考下2014-10-10
Spring Boot中單例類實現(xiàn)對象的注入方式
這篇文章主要介紹了Spring Boot中單例類實現(xiàn)對象的注入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

