摆脱if判断的固化编程,采用回调完成多业务类型下的处理,使得程序在面对新的业务类型时能更加灵活处理,适用于可扩展的业务场景。
因消息的业务类型有多个,并且考虑到项目后期类型会有扩展,所以此处以消息处理为例恰到好处。
1、定义回调接口
public interface UserMessageService { Map<String,MessageCallback> callbacks = new HashMap<>(); interface MessageCallback { void callback(String params); } void registerCallback(String messageType,MessageCallback callback); }
2、实现回调接口
@Service public class UserMessageServiceImpl implements UserMessageService { @Override public void registerCallback(String messageType, MessageCallback callback) { callbacks.put(messageType,callback); } }
3、监听消息并依据不同业务类型选择回调方法
@Component public class UserMessageListener implements MessageListener { @Override public void onMessage(Message message, byte[] bytes) { byte[] body = message.getBody(); byte[] channel = message.getChannel(); String content = new String(body, Charsets.UTF_8); String topic = new String(channel, Charsets.UTF_8); if (StringUtils.isNotBlank(content)){ MessageService.MessageCallback callback = UserMessageService.callbacks.get(topic); if (callback != null){ callback.callback(content); } } } }
4、具体业务处理(回调方法实现)
@Component public class UserRegisterProcesser implements MessageService.MessageCallback{ @Autowired private UserMessageService messageService; @PostConstruct public void registerCallback() { messageService.registerCallback(MessageTypeEnum.USER_REGISTER.getEnumName(), this); } @Override public void callback(String params){ //TODO } }
若有业务类型扩展,只需新增对应业务类型的Bean,然后实现回调接口,类似于上述中UserRegisterProcesser,而无需在消息监听的处理方法中新增if判断。