代码实现:
public class ListenerTest {
public static void main(String[] args) {
EventSource eventSource = new EventSource();
eventSource.addListener(new EventListener() {
@Override
public void handleEvent(EventObject event) {
event.doEvent();
if (event.getSource().equals("closeWindows")) {
System.out.println("doClose");
}
}
});
// 传入openWindows事件,通知listener,事件监听器, 对open事件感兴趣的listener将会执行
eventSource.notifyListenerEvents(new EventObject("openWindows"));
eventSource.notifyListenerEvents(new EventObject("closeWindows"));
}
}
// 监听器接口
interface EventListener extends java.util.EventListener {
// 事件处理
public void handleEvent(EventObject event);
}
// 事件对象
class EventObject extends java.util.EventObject {
private static final long serialVersionUID = -2046890195886743191L;
public EventObject(Object source) {
super(source);
}
public void doEvent() {
System.out.println("通知一个事件源 source :" + this.getSource());
}
}
// 事件源
class EventSource {
// 监听器列表,监听器注册后则加入此列表
private Vector<EventListener> listeners = new Vector<>();
// 注册监听器
public void addListener(EventListener listener) {
listeners.add(listener);
}
// 撤销注册
public void removeListener(EventListener listener) {
listeners.remove(listener);
}
// 接收外部事件
public void notifyListenerEvents(EventObject event) {
for (EventListener eventListener : listeners) {
eventListener.handleEvent(event);
}
}
}
观察者模式对比(实现原理一样):
public class Test {
public static void main(String[] args) {
Watched watch = new Watched();
watch.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
if ("open".equals(arg.toString())) {
System.out.println("open window");
}
}
});
watch.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
if ("close".equals(arg.toString())) {
System.out.println("close window");
}
}
});
watch.notifyObservers("open");
watch.notifyObservers("close");
}
}
class Watched extends Observable {
@Override
public void notifyObservers(Object arg) {
super.setChanged();
super.notifyObservers(arg);
}
}