1.白话文定义
对象间的一种一对多的依赖关系。当一个对象的状态发生变化,所有依赖它的对象都将得到通知, 使这些观察者执行相应的逻辑。
2.角色
1.事件监听接口类:定义接口;
2.事件监听实现类:实现具体的方法;
3.事件管理者类:提供给事件订阅,取消订阅,事件通知等方法;
4.客户端调用者:被观察者调用事件管理类,进行事件的订阅,取消订阅和通知等操作。
3.类图
4.代码实现
1.事件监听接口类
public interface EventListener {
void onEvent(String param);
}
2.事件监听实现类
public class MsgEventListener implements EventListener {
@Override
public void onEvent(String param) {
System.out.println("短信消息事件");
}
}
public class PushEventListener implements EventListener {
@Override
public void onEvent(String param) {
System.out.println("push消息事件");
}
}
3.事件管理者类
public class EventManager {
Map<Enum<EventType>, List<EventListener>> listeners = new HashMap<>();
/**
* @param operators
* @return
* @desc 事件管理器
*/
public EventManager(Enum<EventType>... operators) {
for (Enum<EventType> typeEnum : operators) {
listeners.put(typeEnum, new ArrayList<>());
}
}
/**
* @param eventType 事件类型
* @param eventListener 事件监听器
* @desc 订阅事件
*/
public void subscribe(EventType eventType, EventListener eventListener) {
List<EventListener> list = listeners.get(eventType);
list.add(eventListener);
}
/**
* @param eventType 事件类型
* @param eventListener 事件监听器
* @desc 取消订阅
*/
public void unsubscribe(EventType eventType, EventListener eventListener) {
List<EventListener> list = listeners.get(eventType);
list.remove(eventListener);
}
/**
* @param eventType 事件类型
* @param param 参数
* @desc 事件通知
*/
public void notify(EventType eventType, String param) {
List<EventListener> list = listeners.get(eventType);
for (EventListener eventListener : list) {
eventListener.onEvent(param);
}
}
/**
* @author kerry
* @desc 事件类型枚举类
* @date 2022/12/11
*/
public enum EventType {
MSG, PUSH
}
}
4.客户端调用者
public class Main {
public static void main(String[] args) {
EventManager eventManager = new EventManager(EventManager.EventType.MSG, EventManager.EventType.PUSH);
//订阅短信事件
eventManager.subscribe(EventManager.EventType.MSG, new MsgEventListener());
//订阅push消息事件
eventManager.subscribe(EventManager.EventType.PUSH, new PushEventListener());
//事件通知
eventManager.notify(EventManager.EventType.MSG, "kerry");
}
}
5.优点
1.观察者和被观察者是抽象耦合关系;
2.建立一套触发机制。
6.缺点
如果被观察者对象有很多观察者,则事件通知会花费更多时间。
7.使用场景
需要对一个事件状态进行监听,然后执行更多剩余逻辑。