事件源
持有关注在该消息源上的消息监听器列表,事件发生后通过监听列表进行事件透出。
public class EventSource {private List<TimeoutEventListener> timeoutEventListeners;public EventSource() {timeoutEventListeners = new ArrayList<>();timeoutEventListeners.add(new SendAlertTimeoutEventListener());timeoutEventListeners.add(new SendFileTimeoutEventListener());}public static void main(String[] args) {new EventSource().doSomething();}public void doSomething(){LocalDateTime expireDate = LocalDateTime.of(2019, 12, 20, 23, 4);if (expireDate.isBefore(LocalDateTime.now())){System.out.println("触发某个业务的超时事件");publishEvent(new TimeoutEventObject(expireDate));}}private void publishEvent(TimeoutEventObject arg){for (TimeoutEventListener listener : timeoutEventListeners) {listener.onTimeout(arg);}}}
监听器
TimeoutEventObject是事件对象,可以定义事件需要透传的属性。 TimeoutEventListener是继承jdk中的EventListener,但这是一个标记接口(无任何规范接口)。 SendAlertTimeoutEventListener和SendFileTimeoutEventListener是业务对监听器的不同实现。
public interface TimeoutEventListener extends EventListener {void onTimeout(TimeoutEventObject eventObject);}public class SendAlertTimeoutEventListener implements TimeoutEventListener {@Overridepublic void onTimeout(TimeoutEventObject eventObject) {System.out.println("发送过期消息给钉钉,过期时间:"+eventObject.getExpireDate());}}public class SendFileTimeoutEventListener implements TimeoutEventListener {@Overridepublic void onTimeout(TimeoutEventObject eventObject) {System.out.println("发送过期消息给文件,过期时间:"+eventObject.getExpireDate());}}public class TimeoutEventObject extends EventObject {private LocalDateTime expireDate;public LocalDateTime getExpireDate() {return expireDate;}public void setExpireDate(LocalDateTime expireDate) {this.expireDate = expireDate;}/*** Constructs a prototypical Event.** @param source The object on which the Event initially occurred.* @throws IllegalArgumentException if source is null.*/public TimeoutEventObject(Object source) {super(source);this.expireDate = (LocalDateTime)source;}}
