结合Java8特性实现策略模式

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

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值