当前位置: 首页 > news >正文

java设计模式之:策略模式+工厂模式整合案例实战(一)

本文介绍项目中常用的策略模式+工厂模式的案例,该案例是针对策略类比较少的情况下一篇会讲解策略类比较多的案例,下面直接开始:

案例1:项目中对系统中的客户和销售进行事件通知(短信、邮件、钉钉)

首先要有通知的策略接口,接口里面要有一个方法就是通知的方法

public interface PushChannelStrategy{// 通知方法SendResult send(MessagePushParam param,BaseMsg baseMsg);}

有了接口那必然有实现类,三个实现类短信、邮件、钉钉

短信:

@Slf4j
@Component
public class SmsPushChannelStrategy implements PushChannelStrategy{@Autowiredprivate NoticeClient noticeClient;@Overridepublic SendResult send(MessagePushParam param,BaseMsg baseMsg){//1、before send check//2、send smsNoticeResult noticeResult=noticeClient.sendSms(xxxx);sendResult.setMessageStatus(MessageStatusEnum.SUCCESS);return sendResult;}
}

邮件:

@Slf4j
@Component
public class EmailPushChannelStrategy implements PushChannelStrategy{@Autowiredprivate NoticeClient noticeClient;@Overridepublic SendResult send(MessagePushParam param,BaseMsg baseMsg){//1、before send check//2、send emailEmail emailMsg=(Email)baseMsg;NoticeResult noticeResult=noticeClient.sendEmail(xxxx);sendResult.setMessageStatus(MessageStatusEnum.SUCCESS);return sendResult;}
}

钉钉:

@Slf4j
@Component
public class DingTalkPushChannelStrategy implements PushChannelStrategy{@Autowiredprivate DingTalkClient dingTalkClient;@Overridepublic SendResult send(MessagePushParam param,BaseMsg baseMsg){//1、before send check//2、send ding talkSendResult sendResult=dingTalkClient.send(xxx);// 其他结果参数组装return sendResult;}
}

然后通过策略工厂来获取具体的策略类:(由于只有三个策略类,所以通过注入的方式对channel进行判断)

@Component
public class PushChannelStrategyFactory{@Autowired private DingTalkPushChannelStrategy dingTalkPushChannelStrategy;@Autowiredprivate SmsPushChannelStrategy smsPushChannelStrategy;@Autowiredprivate EmailPushChannelStrategy emailPushChannelStrategy;public PushChannelStrategy getStrategy(PushChannel pushChannel){switch(pushChannel){case DING_TALK:return dingTalkPushChannelStrategy;case SMS:return smsPushChannelStrategy;case EMAIL:return emailPushChannelStrategy;default:throw new RuntimeException("不支持的类型");}}
}

当然策略工厂针对策略实现类比较少的情况还可以这样写:

@Component
public class PushChannelStrategyFactory2{@Autowiredprivate DingTalkPushChannelStrategy dingTalkPushChannelStrategy;@Autowiredprivate SmsPushChannelStrategy smsPushChannelStrategy;@Autowiredprivate EmailPushChannelStrategy emailPushChannelStrategy;private static final Map<PushChannel,PushChannelStrategy> pushChannelBuilderMap=new HashMap<>();@PostConstructpublic void init(){pushChannelBuilderMap.put(PushChannel.SMS,smsPushChannelStrategy);pushChannelBuilderMap.put(PushChannel.Email,emailPushChannelStrategy);pushChannelBuilderMap.put(PushChannel.DING_TALK,dingTalkPushChannelStrategy);}Public PushChannelStrategy getStrategy(PushChannel PushChannel){if(PushChannel==null){return null;}return pushChannelBuilderMap.get(PushChannel);}
}

用到的枚举类:

@Getter
public enum PushChannel{SMS("sms","短信"),EMAIL("email","邮件"),DING_TALK("dingTalk","钉钉");private final String value;PushChannel(String value,String desc){this.value=value;}public static PushChannel getPushChannel(String pushChannel){if(pushChannel==null){return null;}for(PushChannel channel:PushChannel.values()){if(pushChannel.equals(channel.getValue())){return channel;}}return null;}
}

在使用的时候通过策略工厂里面的方法获取具体的策略类:

@Slf4j
@Servicepublic class MessagePushService{@Autowiredprivate PushChannelStrategyFactory pushChannelStrategyFactory;@Autowiredprivate MessageRecordRepository messageRecordRepository;public ResultDTO<Boolean> pushSync(MessagePushCommand command){MessagePushParam messagePushParam =MessagePushAssembler.convert(command);//1,业务逻辑处理//2、根据渠道进行触达PushChannel pushChannel=messagePushParam.getChannel();if(pushChannel==null){throw new MessagePushException(xxx);}//3、获取具体的策略类PushChannelStrategy pushChannelStrategy=pushChannelStrategyFactory.getStrategy(pushChannel);SendResult sendResult=PushChannelStrategy.send(messagePushParam,xxx);//4,记录落库return ResultDTO.getSuccessResult(true);}}

到此该版本的策略模式+工厂模式就结束了,欢迎点评和指出不足之处。

http://www.lryc.cn/news/399003.html

相关文章:

  • 国内Ubuntu安装 stable-diffusion教程,换成国内镜像
  • JAVA final详细介绍
  • 45、tomcat+课后实验
  • 设计模式的七大原则
  • ThreeJS-3D教学十五:ShaderMaterial(noise、random)
  • LeetCode 2974.最小数字游戏:排序+交换奇偶位
  • 使用vllIm部署大语言模型
  • 静态搜索iOS动态链接函数的调用位置
  • 【鸿蒙学习笔记】尺寸设置・layoutWeight・对子组件进行重新布局
  • vue实现表单输入框数字类型校验功能
  • JS登录页源码 —— 可一键复制抱走
  • Kithara与OpenCV (一)
  • 什么是软件定义安全SDSec
  • 【C语言】C语言可以做什么?
  • WordPress 主题技巧:给文章页增加“谁来过”模块。
  • 【vue组件库搭建07】Vitest单元测试
  • JSONObject和Map<String, Object>的转换
  • C# 建造者模式(Builder Pattern)
  • 初阶数据结构速成
  • nx上darknet的使用-目标检测-在python中的使用
  • Python高级(四)_内存管理
  • 关键路径-matlab
  • JavaDS —— 单链表 与 LinkedList
  • LangChain —— Message —— how to filter messages
  • conda install问题记录
  • 【python】IPython的使用技巧
  • 常用知识点问答
  • paddlenlp cpu windows 下测试gpt
  • uboot的功能
  • java导出word实现