文章目录
- 监听者模式
监听者模式
监听器模式指的是事件源经过事件的封装传给监听器,当事件源触发事件之后,监听器收到事件的通知并执行事件回调方法。
- | 监听者 | 观察者 |
---|---|---|
概念定义 | 当范围对象的状态发生变化时,服务器自动调用监听器对象中的方法来处理事件。监听者模式通过事件对象来传递事件信息,事件对象封装了事件源对象和事件相关信息,使得事件的触发和处理更加灵活 | 在对象之间定义了一对多的依赖关系,当一个对象(被观察者)的状态发生变化时,所有依赖它的对象(观察者)都会收到通知并自动更新。观察者模式简化了事件-监听模式的实现,主要通过被观察者和观察者之间的直接通知来实现状态的更新 |
应用场景 | 监听者模式适用于事件类型超过1种且需要区别对待的场景。例如,监听老板的不同指令(加班、交付等),根据不同指令执行不同操作 | 适用于类似发布和订阅的场景,当有发布内容时,将发布内容推送给订阅者即可,无需区分事件类型,区别对待 |
代码实现差异 | 监听者模式需要实现事件源、事件对象和事件监听器三个角色。事件源需要经过事件的封装传递给监听器,监听器接收到事件对象后进行回调处理 | 观察者模式则相对简洁,只需要实现被观察者和观察者两个角色。被观察者在状态变化时直接通知观察者,观察者收到通知后进行更新 |
附观察者模式:https://blog.csdn.net/qq_26437925/article/details/148292634
- 事件
public class Event {// 事件类型private String type;// 事件的数据private String data;// 事件源private EventSource source;public Event(String type, String data, EventSource source) {this.type = type;this.data = data;this.source = source;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getData() {return data;}public void setData(String data) {this.data = data;}public EventSource getSource() {return source;}public void setSource(EventSource source) {this.source = source;}
}
- 事件源(管理事件监听器,触发事件)
public class EventSource {// 监听者对象private List<EventListener> listeners = new ArrayList<>();// 注册监听者public void registerListener(EventListener listener) {listeners.add(listener);}// 移除监听者public void removeListener(EventListener listener) {listeners.remove(listener);}// 事件触发,通知每个listenerpublic void fireEvent(Event event) {for (EventListener listener : listeners) {listener.handleEvent(event);}}
}
- 事件监听的抽象接口
public interface EventListener {// 处理监听的事件void handleEvent(Event event);
}
测试类:
public class ListenerMainTest {public static void main(String[] args) {// 事件源, 用来触发事件通知EventSource eventSource = new EventSource();// 监听者EventListener listener1 = new EventListener() {@Overridepublic void handleEvent(Event event) {System.out.println("listener 1:" + event.getData());}};EventListener listener2 = new EventListener() {@Overridepublic void handleEvent(Event event) {System.out.println("listener 2:" + event.getData());}};// 注册监听者eventSource.registerListener(listener1);eventSource.registerListener(listener2);// 事件触发eventSource.fireEvent(new Event("greeting", "Hello World!", eventSource));// 移除监听者1eventSource.removeListener(listener1);eventSource.fireEvent(new Event("greeting", "Hello Again!", eventSource));}
}