Java 事件訂閱和發(fā)布是一種設(shè)計(jì)模式,通過該模式,一個(gè)消息可以被多個(gè)對(duì)象同時(shí)接收,從而達(dá)到解耦的目的。根據(jù)該模式,一個(gè)事件分為三層:事件源、事件、事件監(jiān)聽器。
事件源是事件發(fā)生的地方,它產(chǎn)生事件并把事件傳遞給事件監(jiān)聽器。事件是一個(gè)封裝了所有事件信息的對(duì)象,包括事件源以及相關(guān)的數(shù)據(jù)。事件監(jiān)聽器是一個(gè)接口,該接口定義了處理事件的方法,事件源會(huì)在事件發(fā)生時(shí)調(diào)用相應(yīng)的方法來通知事件監(jiān)聽器。
Java 中實(shí)現(xiàn)事件訂閱和發(fā)布模式的方式有多種,最常用的方式是使用觀察者模式或者是使用事件模型。在觀察者模式中,事件源是被觀察者,而事件的監(jiān)聽器是觀察者。當(dāng)事件發(fā)生時(shí),被觀察者會(huì)通知所有觀察者并傳遞事件信息。在事件模型中,事件源封裝了事件相關(guān)的信息,在事件源中提供了添加和刪除事件監(jiān)聽器的方法,當(dāng)事件發(fā)生時(shí),事件源會(huì)遍歷所有的事件監(jiān)聽器并調(diào)用相應(yīng)的方法。
public class EventSource {
private List<EventListener> listeners = new ArrayList<>();
public void addEventListener(EventListener listener) {
listeners.add(listener);
}
public void removeEventListener(EventListener listener) {
listeners.remove(listener);
}
public void fireEvent(Event event) {
for (EventListener listener : listeners) {
listener.handleEvent(event);
}
}
}
public interface EventListener {
void handleEvent(Event event);
}
public class Event {
private Object source;
private String type;
private Object data;
public Event(Object source, String type, Object data) {
this.source = source;
this.type = type;
this.data = data;
}
public Object getSource() {
return source;
}
public String getType() {
return type;
}
public Object getData() {
return data;
}
}
public class EventHandler implements EventListener {
@Override
public void handleEvent(Event event) {
// 處理事件
}
}
以上代碼是一個(gè)簡單的事件訂閱和發(fā)布模型的實(shí)現(xiàn),主要包括三個(gè)類:EventSource、EventListener 和 Event。EventSource 是事件源,它包含了添加和刪除事件監(jiān)聽器以及觸發(fā)事件的方法。EventListener 是事件監(jiān)聽器,它定義了事件處理的方法。Event 是事件對(duì)象,它封裝了事件相關(guān)的信息。