摆脱if判断的固化编程,采用回调完成多业务类型下的处理,使得程序在面对新的业务类型时能更加灵活处理,适用于可扩展的业务场景。
因消息的业务类型有多个,并且考虑到项目后期类型会有扩展,所以此处以消息处理为例恰到好处。
1、定义回调接口
public interface MessageService{
Map<String,MessageCallback> callbacks = new HashMap<>();
interface MessageCallback {
void callback(String params);
}
void registerCallback(String messageType,MessageCallback callback);
}
2、实现回调接口
@Service
public class UserMessageServiceImpl implements MessageService{
@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判断。