Java設(shè)計(jì)模式的事件模型詳解
監(jiān)聽(tīng)模式
事件模型實(shí)現(xiàn)了監(jiān)聽(tīng)模式,監(jiān)聽(tīng)模式簡(jiǎn)單來(lái)說(shuō)就是事件源經(jīng)過(guò)事件的封裝傳給監(jiān)聽(tīng)器,當(dāng)事件源觸發(fā)事件后,監(jiān)聽(tīng)器接收到事件對(duì)象可以回調(diào)事件的方法。
參與的角色
事件模型有三種角色參與,分別是:事件源、事件、事件監(jiān)聽(tīng)器。
事件
事件繼承自java.util.EventObject類(lèi),封裝了事件源對(duì)象及跟事件相關(guān)的信息,代碼可以說(shuō)是很簡(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)聽(tīng)器
事件監(jiān)聽(tīng)器實(shí)現(xiàn)java.util.EventListener接口,注冊(cè)在事件源上,當(dāng)事件源的屬性或狀態(tài)改變時(shí),取得相應(yīng)的監(jiān)聽(tīng)器調(diào)用其內(nèi)部的回調(diào)方法。最簡(jiǎn)單的代碼,沒(méi)有之一。
package java.util;
public interface EventListener {
}
事件、事件源、監(jiān)聽(tīng)器之間的關(guān)系
首先產(chǎn)生一個(gè)事件源(EventSource),然后事件(EventObject)封裝事件源信息和事件信息,事件發(fā)生,事件源注冊(cè)監(jiān)聽(tīng)器,通知監(jiān)聽(tīng)器,監(jiān)聽(tīng)器處理事件。
舉個(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)聽(tīng)器
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)聽(tīng)器
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)前線(xiàn)程名稱(chēng):"+Thread.currentThread().getName());
});
source.handle();
}
}
執(zhí)行結(jié)果

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例
本文主要介紹了spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Map按單個(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-02
Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法
這篇文章主要介紹了Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法,本文給出了4種方法,需要的朋友可以參考下2014-10-10
java模擬實(shí)現(xiàn)銀行ATM機(jī)操作
這篇文章主要為大家詳細(xì)介紹了java模擬實(shí)現(xiàn)銀行ATM機(jī)操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Spring Boot中單例類(lèi)實(shí)現(xiàn)對(duì)象的注入方式
這篇文章主要介紹了Spring Boot中單例類(lèi)實(shí)現(xiàn)對(duì)象的注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

