实用的Java回调实现

摆脱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判断。

猜你喜欢

转载自blog.csdn.net/huhailang2018/article/details/80286139