上一篇文章我们分析了一下观察者模式,本篇文章我们将参照观察者模式来看下JAVA事件机制。
java事件机制包括三个部分:事件源、事件监听器(EventListener)、事件(EventObject),前两者分别对应被观察者对象和观察者对象;
- 事件源同被观察者对象一样需要容器来存放监听器,同时提供注册监听器和通知监听器的方法
package com.appleseed.event; import java.util.ArrayList; import java.util.List; /** * 事件源(被观察者对象) * @author wangbo */ public class DataContainer { //监听器(观察者)容器 private List<AddDataEventListener> list = new ArrayList<AddDataEventListener>(); //通知所有监听器(观察者) private void notifyObservers() { for (AddDataEventListener listener : list) { listener.doNotify(new AddDataEvent(this)); } } //注册监听器(观察者) public void registerObserver(AddDataEventListener listener) { list.add(listener); } //模拟增加数据动作 public void dataAdded(){ notifyObservers(); } }
- 事件监听器需要实现EventListener接口,但查看EventListener接口源码会发现其中并没有方法,这说明它只是一个标签接口。此处我们只是简单的实现它,真正应用中可能会需要自定义接口增加自己的方法然后继承EventListener,例如:ChangeListener、ActionListener
package com.appleseed.event; import java.util.EventListener; import java.util.EventObject; /** * 事件监听器(观察者对象),监听数据增加时发生的事件 * @author wangbo */ public class AddDataEventListener implements EventListener { //事件发生时调用的方法,可根据需要重写 public void doNotify(EventObject event) { System.out.println("默认操作--事件源:"+event.getSource().toString()); } }
- 事件并不是观察者模式必需的,但在JAVA事件机制中却不可缺少,它可以看做传递数据的桥梁。事件需要继承EventObject,EventObject提供存放事件源,另外可以自己拓展,增加需要传递的数据
package com.appleseed.event; import java.util.EventObject; /** * 数据增加事件,可以记录事件发生的时间等参数数据 * @author wangbo */ public class AddDataEvent extends EventObject { private static final long serialVersionUID = 3091766606373623182L; public AddDataEvent(Object source) { super(source); } }
- 使用时可重写事件监听器的方法,以应对业务需要
package com.appleseed.event; import java.util.EventListener; import java.util.EventObject; /** * 事件监听器(观察者对象),监听数据增加时发生的事件 * @author wangbo */ public class AddDataEventListener implements EventListener { //事件发生时调用的方法,可根据需要重写 public void doNotify(EventObject event) { System.out.println("默认操作--事件源:"+event.getSource().toString()); } }