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

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

相关内容

热门资讯

玩家科普!湖南赣湘互娱辅助,新... 玩家科普!湖南赣湘互娱辅助,新道游辅助软件,机巧教程(有挂规律)1、打开软件启动之后找到中间准星的标...
总算清楚!哈糖大菠萝怎么挂,科... 总算清楚!哈糖大菠萝怎么挂,科乐天天踢有没有挂作必弊,窍要教程(有挂秘诀)科乐天天踢有没有挂作必弊是...
窍门辅助!hhpoker软件安... 窍门辅助!hhpoker软件安装包,wepoker辅助器安装包,普及教程(有挂秘诀)1、wepoke...
最新技巧!蜀山四川智能辅助插件... 最新技巧!蜀山四川智能辅助插件,哥哥打大a有辅助吗,学习教程(有挂方式)1、下载好蜀山四川智能辅助插...
妙招辅助!pokernow辅助... 妙招辅助!pokernow辅助工具,wepoker科技辅助器,开挂教程(有挂攻略)妙招辅助!poke...
发现玩家!wepoker专用辅... 发现玩家!wepoker专用辅助程序,闲逸辅助脚本,窍门教程(有挂实锤)所有人都在同一条线上,像星星...
于此同时!aa poker透视... 于此同时!aa poker透视软件,欢乐情怀开挂,妙招教程(有挂攻略)暗藏猫腻,小编详细说明欢乐情怀...
积累辅助!hhpoker有没有... 积累辅助!hhpoker有没有外挂,大菠萝辅助器,解迷教程(有挂秘籍)1、全新机制【hhpoker有...
一分钟带你了解!赣湘互娱怎么下... 一分钟带你了解!赣湘互娱怎么下载辅助,潮汕激k脚本,积累教程(真是有挂)1、赣湘互娱怎么下载辅助公共...
三分钟了解!佛手十三道辅助,来... 三分钟了解!佛手十三道辅助,来物局怎么开挂,窍门教程(果真有挂)来物局怎么开挂辅助器是一种具有地方特...