一、监听器原理
- 监听器是基于事件驱动的,用于对操作事件进行监听、处理,是观察者设计模式的应用
- 监听器三元素:
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】,其中事件信息和事件监听处理器是接口,具体实现为:添加事件信息、添加事件监听处理器,具体见上面相关代码。事件监听处理器传递了事件源,可以通过事件源进行操作相关行为。如本例的获取购物车商品数量。大家可以试着实现购物车的删除事件并运行查看结果。事件源封装了事件注册中心,可以注册和取消多个具体事件监听器。