java设计模式之:策略模式+工厂模式整合案例实战(一)
创始人
2025-01-15 03:06:48
0

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

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

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

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

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

短信:

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

邮件:

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

钉钉:

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

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

@Component public class PushChannelStrategyFactory{     @Autowired      private DingTalkPushChannelStrategy dingTalkPushChannelStrategy;     @Autowired     private SmsPushChannelStrategy smsPushChannelStrategy;     @Autowired     private 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{     @Autowired     private DingTalkPushChannelStrategy dingTalkPushChannelStrategy;     @Autowired     private SmsPushChannelStrategy smsPushChannelStrategy;     @Autowired     private EmailPushChannelStrategy emailPushChannelStrategy;          private static final Map pushChannelBuilderMap=new HashMap<>();          @PostConstruct     public 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 @Service  public class MessagePushService{      @Autowired      private PushChannelStrategyFactory pushChannelStrategyFactory;      @Autowired      private MessageRecordRepository messageRecordRepository;            public ResultDTO 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);     }  }

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

相关内容

热门资讯

黑科技系统!wpk外挂是真的还... 黑科技系统!wpk外挂是真的还是假的(黑科技ai)太实锤了真是有挂(2022已更新)(哔哩哔哩)1、...
记者揭秘“wpk透视辅助合作”... 1、记者揭秘“wpk透视辅助合作”外挂透明挂辅助软件(本来有挂)-哔哩哔哩;详细教程。2、wpk透视...
今日头条“雀友会广东潮汕辅助”... 今日头条“雀友会广东潮汕辅助”太实锤了透视辅助开挂必赢方法-本来有挂1、构建自己的雀友会广东潮汕辅助...
黑科技黑科技!聚星扑克这个平台... 黑科技黑科技!聚星扑克这个平台靠谱吗(黑科技ai)太实锤了确实是真的有挂(2024已更新)(哔哩哔哩...
总算了解“wepoke德州扑克... 总算了解“wepoke德州扑克ai软件”外挂透明挂辅助app(其实是真的有挂)-哔哩哔哩是一款可以让...
分享一款“新二号辅助软件下载”... 分享一款“新二号辅助软件下载”太嚣张了透视辅助开挂软件教程-一贯真的是有挂1、分享一款“新二号辅助软...
技巧知识分享“德州之星辅助器使... 技巧知识分享“德州之星辅助器使用教程”外挂透明挂辅助挂(好像有挂)-哔哩哔哩;wpk透视辅助官方版是...
黑科技辅助!红龙扑克电脑模拟器... 黑科技辅助!红龙扑克电脑模拟器(透明黑科技)太实锤了果然是有挂(2021已更新)(哔哩哔哩);红龙扑...
发现一款“蜀山四川智能辅助插件... 发现一款“蜀山四川智能辅助插件”太夸张了透视辅助开挂扑克教程-竟然有挂1、完成蜀山四川智能辅助插件的...
终于知道“微扑克发牌规律性总结... 终于知道“微扑克发牌规律性总结”外挂透明挂辅助脚本(真是真的有挂)-哔哩哔哩;(需添加指定威信136...