工厂模式应用

前言

https://www.cnblogs.com/handsometaoa/p/17025186.html

代码

工厂类:

@Component
public class XXEventHandlerFactory implements ApplicationContextAware {

    private ApplicationContext applicationContext;
    Map<Integer, XXEventHandler> handlerMap = new HashMap<>();

    @Override
    public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    @PostConstruct
    private void afterPropertiesSet() {
        applicationContext.getBeansOfType(XXEventHandler.class).values()
                .forEach(handler -> handlerMap.put(handler.getEventType(), handler));
    }

    public XXEventHandler getHandler(Integer eventType) {
        return handlerMap.get(eventType);
    }
}

处理器接口:

public interface XXEventHandler {

    // 获取事件类型
    Integer getEventType();
    
    // 处理程序 (此处可定义为实体类,也可使用String)
    void handle(XXEventEntity eventDTO);

}

实际处理器实现:

@Component
public class AEventHandler implements XXEventHandler {

    @Override
    public Integer getEventType() {
        // 使用枚举类返回唯一标识该处理器的标记
        return XXEventEnum.A.getEventType();
    }

    @Override
    public void handle(XXEventEntity eventDTO) {
        // xxx 进行事件处理 
    }
}

使用

// 生产事件
XXEventEntity aEventEntity = new XXEventEntity();
aEventEntity.setEventType(XXEventEnum.A.getEventType());
aEventEntity.setXXX();
// 此处可以将 事件存进数据库/发送至消息队列



// 处理事件
// 1. 从数据库/消息队列获取事件
// 2. 获取aEventEntity eventType
// 3. 获取处理器 xXEventHandlerFactory.getHandler(eventType).handle(aEventEntity);
posted @ 2024-10-11 16:16  帅气的涛啊  阅读(3)  评论(0编辑  收藏  举报