要理解JAVA事件机制,首先需要理解设计模式中的观察者模式(Observer),在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知,上类图
- 先看下Subject接口,它就是被观察对象的接口,其中规定了registerObserver(注册观察者)、removeObserver(删除观察者)与notifyObserver(通知观察者)3个方法。
ConcreteSubject为被观察者对象的具体实现类,Subject接口可以存在多个实现package com.appleseed.dp.observer; /** * 被观察者对象接口 * @author wangbo */ public interface Subject { /** * 注册观察者 * @param observer */ public void registerObserver(Observer observer); /** * 删除观察者 * @param observer */ public void removeObserver(Observer observer); /** * 通知观察者 */ public void notifyObservers(); }
package com.appleseed.dp.observer; import java.util.ArrayList; import java.util.List; /** * 被观察者对象 * @author wangbo */ public class ConcreteSubject implements Subject { //观察者容器 private List list = new ArrayList (); @Override public void notifyObservers() { for (Observer observer : list) { observer.doNotify(); } } @Override public void registerObserver(Observer observer) { list.add(observer); } @Override public void removeObserver(Observer observer) { list.remove(observer); } }
- Observer为观察者对象的接口,主要规定接到通知后需要执行的方法。
ConcreteObserver为观察者对象的具体实现类,并实现接到通知后执行的具体动作,此实现类也可以有多个。package com.appleseed.dp.observer; /** * 观察者对象接口 * @author wangbo */ public interface Observer { /** * 通知执行 */ public void doNotify(); }
package com.appleseed.dp.observer; /** * 观察者对象 * @author wangbo */ public class ConcreteObserverA implements Observer { @Override public void doNotify() { System.out.println("A被通知"); } }
package com.appleseed.dp.observer; /** * 观察者对象 * @author wangbo */ public class ConcreteObserverB implements Observer { @Override public void doNotify() { System.out.println("B被通知"); } }
- 观察者模式测试
输出结果package com.appleseed.dp.observer; /** * 观察者模式测试类 * @author wangbo */ public class TestObserver { /** * @param args */ public static void main(String[] args) { //实例化被观察者对象 Subject subject = new ConcreteSubject(); //实例化观察者对象 Observer observerA = new ConcreteObserverA(); Observer observerB = new ConcreteObserverB(); //注册观察者对象 subject.registerObserver(observerA); subject.registerObserver(observerB); //被观察者通知观察者执行 subject.notifyObservers(); System.out.println("------------------------------"); //删除观察者对象 subject.removeObserver(observerA); subject.notifyObservers(); } }
A被通知
B被通知
------------------------------
B被通知
由输出结果可以看出,注册后的观察者收到通知
下面一篇我们来看下JAVA事件机制