
一、監聽器原理
- 監聽器是基於事件驅動的,用於對操作事件進行監聽、處理,是觀察者設計模式的應用
- 監聽器三元素:
2.1 事件源:事件發生的源頭
2.2 事件:對事件進行抽象、封裝
2.3 監聽器:用於監聽事件源,當事件發生時進行處理
二、監聽器實例:此案例主要圍繞購物車場景操作事件的實現,有一定的實際項目參考性
- UML類圖模型

- 接口及實現類、場景類定義
-
package com.wuji; import java.util.EventListener; /** * event listener handler interface must extends EventListener */ public interface EventListenerHandler extends EventListener { void handler(EventInfo eventInfo); }
package com.wuji; /** * Event Info operator interface */ public interface EventInfo { String getEventType(); Object getEventSource(); }
-
package com.wuji; /** * 添加事件監聽器,實現監聽器接口類 */ public class AddEventListenerHandler implements EventListenerHandler { public void handler(EventInfo eventInfo) { if(eventInfo==null){ return; } if(eventInfo.getEventType().equals("add")){ System.out.println("添加購物車事件。。。"); } EventSource eventSource=(EventSource)eventInfo.getEventSource(); int productCount=eventSource.getCount(); System.out.println("購物車中現在有商品:" + productCount + "件"); } }
package com.wuji; import java.util.EventObject; public class AddEvent extends EventObject implements EventInfo { private final String eventType="add"; public AddEvent(Object source){ super(source); } @Override public String getEventType() { return eventType; } @Override public Object getEventSource() { return getSource(); } }
-
package com.wuji; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; /** * 事件源:具體為購物輻操作事件源 */ public class EventSource { private Collection<EventListenerHandler> eventListenerHandlers=null; private int count=0; public int getCount(){ return count; } public void registryEventListenerHandler(EventListenerHandler eventListenerHandler){ if(eventListenerHandlers==null){ eventListenerHandlers=new HashSet<EventListenerHandler>(); eventListenerHandlers.add(eventListenerHandler); } } public void removeEventListenerHandler(EventListenerHandler eventListenerHandler){ if(eventListenerHandlers!=null){ eventListenerHandlers.remove(eventListenerHandler); } } public void addCar(){ ++count; if(eventListenerHandlers!=null){ EventInfo eventInfo=new AddEvent(this); notifies(eventInfo); } System.out.println("向購物車添加商品成功..."); } private void notifies(EventInfo eventInfo){ Iterator iterator=eventListenerHandlers.iterator(); while (iterator.hasNext()){ ((EventListenerHandler)iterator.next()).handler(eventInfo); } } }
package com.wuji; public class Client { public static void main(String[] args) { EventSource eventSource=new EventSource(); EventListenerHandler addEventListenerHandler=new AddEventListenerHandler(); eventSource.registryEventListenerHandler(addEventListenerHandler); //eventSource.removeEventListenerHandler(addEventListenerHandler); eventSource.addCar(); eventSource.addCar(); } }

三、總結:上面的案例是圍繞購物車操作場景進行事件監聽操作的,主要涉及三個元素即事件源【EventSource】、事件信息接口【EventInfo】、事件監聽處理器接口【EventListenerHandler】,其中事件信息和事件監聽處理器是接口,具體實現為:添加事件信息、添加事件監聽處理器,具體見上面相關代碼。事件監聽處理器傳遞了事件源,可以通過事件源進行操作相關行為。如本例的獲取購物車商品數量。大家可以試着實現購物車的刪除事件並運行查看結果。事件源封裝了事件注冊中心,可以注冊和取消多個具體事件監聽器。
