在企业项目开发中,需求会有各种消息平台需要推送消息,如果重复写ifelse判断执行显得代码不优雅,这时候可以用引用策略模式来减少条件判断从而美化代码。
以往策略模式都需要建立策略类来实现策略方法,这样会使策略类过多导致代码臃肿,因为我们只需要发送消息的方法而已,这时候我们可以引进JAVA8的函数式接口Consumer,用其accept()方法来执行函数方法,然后将策略方法放入缓存的map中,发送消息时候根据消息类型加载对应的Consumer来执行accept()方法,这样就实现了策略模式了。
后续如果有新的消息平台类型加入,我们只需要增加策略方法就即可,极大的增加了代码的扩展性。
/**
* @author lw
* @date 2022-07-18 22:43
*/
@Slf4j
@RequiredArgsConstructor
@Component
public class SendMessageService {
private static final Map<Integer, Consumer<SendMessageDTO>> METHOD_MAP = new HashMap<>();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
METHOD_MAP.put(MessageTemplateTypeEnum.SMS.getMessageTemplateType(), this::sendSms);
METHOD_MAP.put(MessageTemplateTypeEnum.APP_PUSH.getMessageTemplateType(), this::sendAppPush);
METHOD_MAP.put(MessageTemplateTypeEnum.APP_MAIL.getMessageTemplateType(), this::sendAppMail);
METHOD_MAP.put(MessageTemplateTypeEnum.WECHAT_CUSTOMER_SERVICE_MESSAGE.getMessageTemplateType(), this::sendWechatCustomerServiceMessage);
METHOD_MAP.put(MessageTemplateTypeEnum.WECHAT_MESSAGE_TEMPLATE.getMessageTemplateType(), this::sendWechatMessageTemplate);
METHOD_MAP.put(MessageTemplateTypeEnum.WECHAT_MASS_MESSAGING.getMessageTemplateType(), this::sendWechatMassMessaging);
METHOD_MAP.put(MessageTemplateTypeEnum.WECHAT_SUBSCRIPTION_MESSAGE_TEMPLATE.getMessageTemplateType(), this::sendWechatSubscriptionMessageTemplate);
}
/**
* 发送消息
*
* @param sendMessageTemplateDTO sendMessageTemplateDTO
*/
public void sendMessageTemplate(SendMessageTemplateDTO<?> sendMessageTemplateDTO) {
//调用对应的策略方法
Consumer<SendMessageDTO> consumer = METHOD_MAP.get(messageTemplate.getTemplateType());
if (Objects.isNull(consumer)) {
log.error("消息类型分发策略不存在, templateType={}", messageTemplate.getTemplateType());
return;
}
SendMessageDTO sendMessageDTO = new SendMessageDTO();
sendMessageDTO.setContent(sendMessageTemplateDTO.getContent());
sendMessageDTO.setMessageTemplateSubject(sendMessageTemplateDTO.getMessageSubject());
sendMessageDTO.setSendType(sendMessageTemplateDTO.getSendType());
consumer.accept(sendMessageDTO);
}
/**
* 发送短信
*
* @param sendMessageDTO sendMessageDTO
*/
private void sendSms(SendMessageDTO sendMessageDTO) {
log.info("发送短信");
}
/**
* 发送APP_Push
*
* @param sendMessageDTO sendMessageDTO
*/
private void sendAppPush(SendMessageDTO sendMessageDTO) {
log.info("发送APP_Push");
}
/**
* 发送APP站内信
*
* @param sendMessageDTO sendMessageDTO
*/
private void sendAppMail(SendMessageDTO sendMessageDTO) {
log.info("发送APP站内信");
}
/**
* 发送公众号客服消息
*
* @param sendMessageDTO sendMessageDTO
*/
private void sendWechatCustomerServiceMessage(SendMessageDTO sendMessageDTO) {
log.info("发送公众号客服消息");
}
/**
* 发送公众号消息模板
*
* @param sendMessageDTO sendMessageDTO
*/
private void sendWechatMessageTemplate(SendMessageDTO sendMessageDTO) {
log.info("发送公众号消息模板");
}
/**
* 发送公众号群发消息
*
* @param sendMessageDTO sendMessageDTO
*/
private void sendWechatMassMessaging(SendMessageDTO sendMessageDTO) {
log.info("发送公众号群发消息");
}
/**
* 发送公众号订阅消息模板
*
* @param sendMessageDTO sendMessageDTO
*/
private void sendWechatSubscriptionMessageTemplate(SendMessageDTO sendMessageDTO) {
log.info("发送公众号订阅消息模板");
}
}