监听器模式实际上是观察者模式中的一种,二者都有关于回调的设计。java
与观察者模式不一样的是,观察者模式中存在的角色为观察者(Observer)
和被观察者(Observable)
ide
而监听器模式中存在三种角色函数
简单的概述就是: 事件源通过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象能够回调事件的方法this
下面这张图能够很详细解释他们之间的关系设计
UML3d
@startuml class EventSource{ - listeners: Vector<EventListener> + void addListener(EventListener listener) + void removeListener(EventListener listener) + void notifyListenerEvents(EventObject eventObject) } class EventObject{ + getSource(): Object + void:say() } interface EventListener{ + void handleEvent(EventObject eventObject) } class ConcreteEvetListenerA{ + void handleEvent(EventObject eventObject) } class ConcreteEvetListenerB{ + void handleEvent(EventObject eventObject) } EventListener <-- ConcreteEvetListenerA EventListener <-- ConcreteEvetListenerB EventObject --o EventListener EventSource -- EventObject @enduml
public class DemoEventSource { /** 监听器列表 */ public Vector<DemoEventListener> listeners = new Vector<>(); /** * 注册监听器 * @param listener EventListener */ public void addListener(DemoEventListener listener) { listeners.add(listener); } /** * 撤销监听器 * @param listener EventListener */ public void removeListener(DemoEventListener listener) { listeners.remove(listener); } /** * 通知全部监听器,包裹事件源成为事件 * @param eventObject EventObject */ public void notifyListenerEvents(EventObject eventObject){ listeners.forEach(listener ->{ listener.handleEvent(eventObject); }); } }
public class DemoEventObject extends EventObject { /** * Constructs a prototypical Event. * * @param source The object on which the Event initially occurred. * @throws IllegalArgumentException if source is null. */ public DemoEventObject(Object source) { super(source); } /** * 事件的回调或者业务逻辑 */ public void say() { System.out.println("this is " + this + " to say"); } }
public interface DemoEventListener extends EventListener { /** * 处理事件 * @param eventObject EventObject */ void handleEvent(EventObject eventObject); } public class ConcreteEventListenerA implements DemoEventListener { @Override public void handleEvent(EventObject eventObject) { System.out.println("ConcreteEventListenerA accept eventObject , eventSource is : " + eventObject.getSource()); if (eventObject instanceof DemoEventObject) { // 执行事件的回调函数/具体业务逻辑 ((DemoEventObject) eventObject).say(); } } } public class ConcreteEventListenerB implements DemoEventListener { @Override public void handleEvent(EventObject eventObject) { System.out.println("ConcreteEventListenerB accept eventObject , eventSource is : " + eventObject.getSource()); if (eventObject instanceof DemoEventObject) { // 执行事件的回调函数/具体业务逻辑 ((DemoEventObject) eventObject).say(); } } }
public class Client { public static void main(String[] args) { // 初始化监听器 DemoEventListener demoEventListenerA = new ConcreteEventListenerA(); DemoEventListener demoEventListenerB = new ConcreteEventListenerB(); // 事件源A DemoEventSource demoEventSource1 = new DemoEventSource(); demoEventSource1.addListener(demoEventListenerA); demoEventSource1.addListener(demoEventListenerB); demoEventSource1.notifyListenerEvents(new DemoEventObject(demoEventSource1)); // 事件源B DemoEventSource demoEventSource2 = new DemoEventSource(); demoEventSource2.addListener(demoEventListenerB); demoEventSource2.notifyListenerEvents(new DemoEventObject(demoEventSource2)); } }