结合Java8特性实现策略模式

159 阅读2分钟

在企业项目开发中,需求会有各种消息平台需要推送消息,如果重复写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("发送公众号订阅消息模板");
    }

}
```