文章目錄
- 監聽者模式
監聽者模式
監聽器模式指的是事件源經過事件的封裝傳給監聽器,當事件源觸發事件之后,監聽器收到事件的通知并執行事件回調方法。
- | 監聽者 | 觀察者 |
---|---|---|
概念定義 | 當范圍對象的狀態發生變化時,服務器自動調用監聽器對象中的方法來處理事件。監聽者模式通過事件對象來傳遞事件信息,事件對象封裝了事件源對象和事件相關信息,使得事件的觸發和處理更加靈活? | 在對象之間定義了一對多的依賴關系,當一個對象(被觀察者)的狀態發生變化時,所有依賴它的對象(觀察者)都會收到通知并自動更新。觀察者模式簡化了事件-監聽模式的實現,主要通過被觀察者和觀察者之間的直接通知來實現狀態的更新? |
應用場景 | 監聽者模式?適用于事件類型超過1種且需要區別對待的場景。例如,監聽老板的不同指令(加班、交付等),根據不同指令執行不同操作? | 適用于類似發布和訂閱的場景,當有發布內容時,將發布內容推送給訂閱者即可,無需區分事件類型,區別對待? |
代碼實現差異 | ?監聽者模式?需要實現事件源、事件對象和事件監聽器三個角色。事件源需要經過事件的封裝傳遞給監聽器,監聽器接收到事件對象后進行回調處理? | 觀察者模式?則相對簡潔,只需要實現被觀察者和觀察者兩個角色。被觀察者在狀態變化時直接通知觀察者,觀察者收到通知后進行更新? |
附觀察者模式:https://blog.csdn.net/qq_26437925/article/details/148292634
- 事件
public class Event {// 事件類型private String type;// 事件的數據private String data;// 事件源private EventSource source;public Event(String type, String data, EventSource source) {this.type = type;this.data = data;this.source = source;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getData() {return data;}public void setData(String data) {this.data = data;}public EventSource getSource() {return source;}public void setSource(EventSource source) {this.source = source;}
}
- 事件源(管理事件監聽器,觸發事件)
public class EventSource {// 監聽者對象private List<EventListener> listeners = new ArrayList<>();// 注冊監聽者public void registerListener(EventListener listener) {listeners.add(listener);}// 移除監聽者public void removeListener(EventListener listener) {listeners.remove(listener);}// 事件觸發,通知每個listenerpublic void fireEvent(Event event) {for (EventListener listener : listeners) {listener.handleEvent(event);}}
}
- 事件監聽的抽象接口
public interface EventListener {// 處理監聽的事件void handleEvent(Event event);
}
測試類:
public class ListenerMainTest {public static void main(String[] args) {// 事件源, 用來觸發事件通知EventSource eventSource = new EventSource();// 監聽者EventListener listener1 = new EventListener() {@Overridepublic void handleEvent(Event event) {System.out.println("listener 1:" + event.getData());}};EventListener listener2 = new EventListener() {@Overridepublic void handleEvent(Event event) {System.out.println("listener 2:" + event.getData());}};// 注冊監聽者eventSource.registerListener(listener1);eventSource.registerListener(listener2);// 事件觸發eventSource.fireEvent(new Event("greeting", "Hello World!", eventSource));// 移除監聽者1eventSource.removeListener(listener1);eventSource.fireEvent(new Event("greeting", "Hello Again!", eventSource));}
}