事件驅動架構模式【其他模式】
阿新 • • 發佈:2019-01-05
urn ase 程序 chan 應用 pat eof sta sin
事件驅動架構模式
public class EventDriven { /** * 事件驅動架構模式: * Send and notify state changes of your objects to other applications * using an Event-driven Architecture. * 使用事件驅動的架構來發送通知【此對象狀態的變更】給應用程序中的其他組件,解耦了事件源和事件處理器。 */ @Test public void all() { final EventDispatcher eventDispatcher = EventDispatcherImpl.builder().build(); eventDispatcher.register(UserCreateEvent.class, new UserCreateHandler()); eventDispatcher.dispacher(UserCreateEvent.of(User.of(Long.valueOf(1), "zxd"))); } } /** * 1)事件抽象 */ interface Event { Class<? extends Event> type(); } abstract class BaseEvent implements Event { @Override public Class<? extends Event> type() { return getClass(); } } /** * 2)事件處理器抽象 */ interface EventHandler<T extends Event> { void handle(T event); } /** * 3)事件調度器抽象 */ interface EventDispatcher { <E extends Event> void register(Class<? extends Event> type, EventHandler<E> hanlder); <E extends Event> void dispacher(E event); } /** * 4)事件調度器實現 */ @Slf4j @Builder class EventDispatcherImpl implements EventDispatcher { @Default private final ConcurrentMap<Class<? extends Event>, EventHandler<? extends Event>> HANDLERS = new ConcurrentHashMap<>(); @Override public <E extends Event> void register(Class<? extends Event> type, EventHandler<E> hanlder) { HANDLERS.putIfAbsent(type, hanlder); } @Override public <E extends Event> void dispacher(E event) { final EventHandler<E> handler = (EventHandler<E>) HANDLERS.get(event.getClass()); if (handler != null) { handler.handle(event); } else { log.error("no handler for event {}", event); } } } @Value(staticConstructor = "of") class User { private Long id; private String name; } /** * 5)具體的事件 */ @Value(staticConstructor = "of") class UserCreateEvent extends BaseEvent { private User user; } /** * 6)具體的事件處理器 */ @Slf4j class UserCreateHandler implements EventHandler<UserCreateEvent> { @Override public void handle(UserCreateEvent event) { log.info("id:{} name:{}", event.getUser().getId(), event.getUser().getName()); } }
事件驅動架構模式【其他模式】