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);     }  }

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

相关内容

热门资讯

绝活儿辅助!广西老友玩老是输怎... 绝活儿辅助!广西老友玩老是输怎么办(辅助挂)都是真的有辅助app(讲解有挂)在进入广西老友玩老是输怎...
法门辅助!福建13水插件(辅助... 法门辅助!福建13水插件(辅助挂)一贯是有辅助技巧(有挂技术)1、许多玩家不知道福建13水插件辅助怎...
办法辅助!潮友会app下载官方... 办法辅助!潮友会app下载官方辅助器(辅助挂)真是真的是有辅助app(有挂教程)该软件可以轻松地帮助...
妙招辅助!邯郸胡乐挂辅助(辅助... 妙招辅助!邯郸胡乐挂辅助(辅助挂)好像存在有辅助插件(有挂方略)1、上手简单,内置详细流程视频教学,...
教程书辅助!乐酷辅助(辅助挂)... 教程书辅助!乐酷辅助(辅助挂)其实存在有辅助脚本(有挂细节)乐酷辅助能透视中分为三种模型:乐酷辅助模...
学习辅助!决战卡五星辅助(辅助... 学习辅助!决战卡五星辅助(辅助挂)本来真的是有辅助软件(有人有挂)学习辅助!决战卡五星辅助(辅助挂)...
绝活辅助!边锋嘉兴麻将辅助器(... 绝活辅助!边锋嘉兴麻将辅助器(辅助挂)真是真的有辅助神器(新版有挂)1、边锋嘉兴麻将辅助器公共底牌简...
举措辅助!枫叶辅助器(辅助挂)... 举措辅助!枫叶辅助器(辅助挂)本来存在有辅助技巧(竟然有挂)1、下载好枫叶辅助器正确养号方法之后点击...
讲义辅助!点我达辅助(辅助挂)... 讲义辅助!点我达辅助(辅助挂)一直存在有辅助技巧(有人有挂)1、点我达辅助辅助器安装包、点我达辅助辅...
模块辅助!威信茶馆有挂的吗(辅... 模块辅助!威信茶馆有挂的吗(辅助挂)一直真的是有辅助脚本(揭秘有挂)1、玩家可以在威信茶馆有挂的吗线...