范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

策略模式短信模板业务场景

  业务代码
  本文主要是介绍策略模式,重点就只在于短信发送时拒绝策略逻辑的处理,不相关的代码就不介绍了。
  主要的接口有两个 SmsTemplatePlaceHolderHandler 短信模板占位符处理器接口,SmsSendRejectStrategy短信发送拒绝策略接口,SmsTemplatePlaceHolderHandler有一个默认的实现类DefaultSmsTemplatePlaceHolderHandler,其关联了一个SmsSendRejectStrategy实例,在发送短信时,具体的短信发送拒绝策略实现类将进行具体的发送拒绝逻辑的处理,如果允许发送,则由DefaultSmsTemplatePlaceHolderHandler将替换了占位符的短信模板内容发出。
  其中,DefaultSmsTemplatePlaceHolderHandler与SmsSendRejectStrategy的关系就是一个具体的策略模式的体现,DefaultSmsTemplatePlaceHolderHandler无需关注拒绝发送的处理逻辑,调用SmsSendRejectStrategy实现类的实例进行处理即可。DefaultSmsTemplatePlaceHolderHandlerpackage com.cube.share.sms.handler;  import com.cube.share.base.utils.JacksonUtils; import com.cube.share.base.utils.PlaceHolderUtils; import com.cube.share.sms.constant.SmsConstant; import com.cube.share.sms.model.param.SmsPlaceHolderParameter; import com.cube.share.sms.strategy.SmsSendRejectStrategy; import com.cube.share.sms.strategy.SmsTemplateContext;  /**  * @author cube.li  * @date 2021/9/4 12:27  * @description 默认的短信模板占位符处理器  */ public class DefaultSmsTemplatePlaceHolderHandler implements SmsTemplatePlaceHolderHandler {      private SmsSendRejectStrategy rejectStrategy;      public DefaultSmsTemplatePlaceHolderHandler(SmsSendRejectStrategy rejectStrategy) {         this.rejectStrategy = rejectStrategy;     }      @Override     public String handle(SmsTemplateContext templateContext, SmsPlaceHolderParameter parameter) {         //发送拒绝策略         rejectStrategy.reject(templateContext, parameter);         return PlaceHolderUtils.replacePlaceHolder(templateContext.getTemplateContent(),                 JacksonUtils.toMap(parameter),                 SmsConstant.DEFAULT_PLACE_HOLDER_REGEX,                 SmsConstant.DEFAULT_PLACE_HOLDER_KEY_REGEX);     } }SmsSendRejectStrategypackage com.cube.share.sms.strategy;  import com.cube.share.base.utils.JacksonUtils; import com.cube.share.sms.model.param.SmsPlaceHolderParameter; import org.springframework.lang.NonNull;  import java.util.HashMap; import java.util.Map; import java.util.Set;  /**  * @author cube.li  * @date 2021/9/4 9:49  * @description 短信发送的拒绝策略  */ public interface SmsSendRejectStrategy {      /**      * 判断是否拒绝发送短信      *      * @param templateContext 短信模板上下文      * @param parameter       填充占位符的参数      */     void reject(SmsTemplateContext templateContext, SmsPlaceHolderParameter parameter);      /**      * 获取短信发送占位符替换参数Set(不包含value为null)      *      * @param parameter 填充占位符的参数      * @return Set      */     @NonNull     default Set getParameterSet(SmsPlaceHolderParameter parameter) {         Map parameterMap = getParameterMap(parameter);         return parameterMap.keySet();     }      /**      * 获取短信发送占位符替换参数Map(不包含value为null)      *      * @param parameter 填充占位符的参数      * @return Map      */     @NonNull     default Map getParameterMap(SmsPlaceHolderParameter parameter) {         Map parameterMap = JacksonUtils.toMap(parameter);         Map filteredParameterMap = new HashMap<>(4);         if (parameterMap != null) {             Set> entrySet = parameterMap.entrySet();             entrySet.forEach(stringObjectEntry -> {                 if (stringObjectEntry.getValue() != null) {                     filteredParameterMap.put(stringObjectEntry.getKey(), stringObjectEntry.getValue());                 }             });         }         return filteredParameterMap;     }  }
  三种拒绝策略的实现类package com.cube.share.sms.strategy;  import com.cube.share.sms.model.param.SmsPlaceHolderParameter;  /**  * @author cube.li  * @date 2021/9/4 11:54  * @description 短信发送拒绝策略-忽略策略,无论短信发送入参与模板是否匹配,都允许发送  */ public class SmsSendIgnoreStrategy implements SmsSendRejectStrategy {      @Override     public void reject(SmsTemplateContext templateContext, SmsPlaceHolderParameter parameter) {         //do nothing     } }package com.cube.share.sms.strategy;  import com.cube.share.base.templates.CustomException; import com.cube.share.sms.model.param.SmsPlaceHolderParameter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils;  import java.util.Set;  /**  * @author cube.li  * @date 2021/9/4 11:45  * @description SmsSendAnyMatchStrategy, 只要占位符参数匹配了短信模板中的任意一个占位符key,就允许发送  */ @Slf4j public class SmsSendAnyMatchStrategy implements SmsSendRejectStrategy {      @Override     public void reject(SmsTemplateContext templateContext, SmsPlaceHolderParameter parameter) {         Set parameterKeySet = getParameterSet(parameter);         if (CollectionUtils.intersection(templateContext.getPlaceHolderKeySet(), parameterKeySet).size() <= 0) {             log.error("短信占位符替换参数与短信模板完全不匹配,templateContent = {},parameter = {}", templateContext.getTemplateContent(), parameter);             throw new CustomException("短信占位符替换参数与短信模板完全不匹配");         }     } }package com.cube.share.sms.strategy;  import com.cube.share.base.templates.CustomException; import com.cube.share.sms.model.param.SmsPlaceHolderParameter; import lombok.extern.slf4j.Slf4j;  import java.util.Set;  /**  * @author cube.li  * @date 2021/9/4 11:57  * @description 短信发送拒绝策略-完全匹配,只有当短信入参与短信模板占位符完全匹配时才允许发送  */ @Slf4j public class SmsSendTotallyMatchStrategy implements SmsSendRejectStrategy {      @Override     public void reject(SmsTemplateContext templateContext, SmsPlaceHolderParameter parameter) {         Set parameterKeySet = getParameterSet(parameter);         if (!parameterKeySet.containsAll(templateContext.getPlaceHolderKeySet())) {             log.error("短信占位符替换参数与短信模板不完全匹配,templateContent = {},parameter = {}", templateContext.getTemplateContent(), parameter);             throw new CustomException("短信占位符替换参数与短信模板不完全匹配");         }     } }拒绝策略实例的创建工厂package com.cube.share.sms.factory;  import com.cube.share.sms.constant.SmsSendRejectStrategyEnum; import com.cube.share.sms.strategy.SmsSendAnyMatchStrategy; import com.cube.share.sms.strategy.SmsSendIgnoreStrategy; import com.cube.share.sms.strategy.SmsSendRejectStrategy; import com.cube.share.sms.strategy.SmsSendTotallyMatchStrategy;  /**  * @author cube.li  * @date 2021/9/4 12:49  * @description 拒绝策略工厂  */ public class SmsSendRejectStrategyFactory {      private static final SmsSendIgnoreStrategy IGNORE_STRATEGY = new SmsSendIgnoreStrategy();      private static final SmsSendAnyMatchStrategy ANY_MATCH_STRATEGY = new SmsSendAnyMatchStrategy();      private static final SmsSendTotallyMatchStrategy TOTALLY_MATCH_STRATEGY = new SmsSendTotallyMatchStrategy();      public static SmsSendRejectStrategy getStrategy(SmsSendRejectStrategyEnum strategyEnum) {         switch (strategyEnum) {             case IGNORE:                 return IGNORE_STRATEGY;             case ANY_MATCH:                 return ANY_MATCH_STRATEGY;             case TOTALLY_MATCH:                 return TOTALLY_MATCH_STRATEGY;             default:                 throw new IllegalArgumentException("Illegal StrategyEnum Param");         }     }  }短信发送服务package com.cube.share.sms.service;  import com.cube.share.base.templates.CustomException; import com.cube.share.sms.config.SmsConfig; import com.cube.share.sms.constant.SmsSendRejectStrategyEnum; import com.cube.share.sms.factory.SmsSendRejectStrategyFactory; import com.cube.share.sms.handler.DefaultSmsTemplatePlaceHolderHandler; import com.cube.share.sms.handler.SmsTemplatePlaceHolderHandler; import com.cube.share.sms.model.param.SmsSendParam; import com.cube.share.sms.strategy.SmsTemplateContext; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service;  import javax.annotation.Resource;  /**  * @author cube.li  * @date 2021/9/4 9:03  * @description 短信服务  */ @Service @Slf4j public class SmsService {      @Resource     private SmsConfig smsConfig;      private SmsTemplatePlaceHolderHandler placeHolderHandler =             new DefaultSmsTemplatePlaceHolderHandler(SmsSendRejectStrategyFactory.getStrategy(SmsSendRejectStrategyEnum.ANY_MATCH));      public void send(SmsSendParam param) {         String templateContent = smsConfig.getTemplates().get(param.getTemplateCode());         if (templateContent == null) {             throw new CustomException("不正确的短信模板");         }         SmsTemplateContext templateContext = SmsTemplateContext.from(templateContent, param.getTemplateCode());         String sendContent = placeHolderHandler.handle(templateContext, param.getParameter());         log.info("短信发送: {}", sendContent);     } }测试
  短信模板在配置文件中#短信 sms:   #模板   templates:     1: "尊敬的用户您好,{companyName}定于{address}开展主题为{title}的营销活动,活动时间{startTime}-{endTime},欢迎您的光临!"     2: "尊敬的用户您好,{address}开展主题为{title}的营销活动将于明天开始,欢迎您的光临!"
  单元测试类package com.cube.share.sms.service;  import com.cube.share.sms.model.param.SmsPlaceHolderParameter; import com.cube.share.sms.model.param.SmsSendParam; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;  import javax.annotation.Resource;  /**  * @author cube.li  * @date 2021/9/4 12:00  * @description  */ @SpringBootTest class SmsServiceTest {      @Resource     SmsService smsService;      @Test     void send() {         SmsSendParam smsSendParam = new SmsSendParam();         smsSendParam.setTemplateCode(1);         SmsPlaceHolderParameter placeHolderParameter = new SmsPlaceHolderParameter();         placeHolderParameter.setAddress("上海");         smsSendParam.setParameter(placeHolderParameter);         smsService.send(smsSendParam);     }  }
  更改拒绝策略,发送短信时日志如下:SmsSendAnyMatchStrategy2021-09-04 14:34:36.261  INFO 5528 --- [           main] com.cube.share.sms.service.SmsService    : 短信发送: 尊敬的用户您好,{companyName}定于上海开展主题为{title}的营销活动,活动时间{startTime}-{endTime},欢迎您的光临!
  可以看出,当拒绝策略为SmsSendAnyMatchStrategy时,只要占位符入参与短信模板中的占位符有一个匹配,就能够发送成功SmsSendTotallyMatchStrategy
  占位符参数与模板占位符不完全匹配时发送失败
  2021-09-04 14:38:16.133 ERROR 3896 --- [           main] c.c.s.s.s.SmsSendTotallyMatchStrategy    : 短信占位符替换参数与短信模板不完全匹配,templateContent = 尊敬的用户您好,{companyName}定于{address}开展主题为{title}的营销活动,活动时间{startTime}-{endTime},欢迎您的光临!,parameter = SmsPlaceHolderParameter(companyName=null, title=null, startTime=null, endTime=null, address=上海, url=null) com.cube.share.base.templates.CustomException: 短信占位符替换参数与短信模板不完全匹配      at com.cube.share.sms.strategy.SmsSendTotallyMatchStrategy.reject(SmsSendTotallyMatchStrategy.java:22)
  占位符参数与模板占位符完全匹配时发送成功
  完全匹配.png
  代码示例:https://gitee.com/li-cube/share/tree/master/sms总结
  业务逻辑说到底就是if-else,使用设计模式能够使代码更易维护、更易拓展,并且代码的阅读性更强;虽然不使用设计模式照样能够实现业务,不过就是多套几层if-else而已,但是人活着总归要有点追求,只有做到不止于业务、不止于代码,才能成为一个脱离低级CRUD的程序员。

谷歌发布Android12。1版比较尴尬的是目前没有手机能用上谷歌公司日前宣布推出Android12。1正式版,此版本实际上也就是Android12L版面向柔性屏可折叠设备的。话说已经很久没有看到安卓系统推出子版本,此次推出的子版本也算是特殊为新生儿准备衣服,应遵循这几个原则准妈妈在迎接即将见面的宝宝时,宝宝的衣服是必须要准备的。但是到了母婴店或者打开购物软件的时候,又不知道该怎么买。我记得当初我给大福准备衣服的时候也很纠结,购物车里几十套衣服,连体分一边在制裁,一边在抄底!美国会议员怒斥华尔街挖墙角对于华尔街来说,政治和军事事件恐怕从来都是绝佳的抄底机会。周五,摩根大通策略师团队周五发表了一份研究报告,将三家俄罗斯能源及钢铁公司债券升至增持评级。摩根大通认为,这些公司仍保持着50岁韩红首次含泪回应质疑声,一首老韩道出27年的酸甜苦辣在公益这条路上,做的最长久的艺人,韩红首屈一指。范冰冰赴阿里做公益,人设崩了江一燕想做最美支教女教师,人设崩了六小龄童5年发同一张合照做公益,说好的温暖世界,只是蒙蔽了大众的双眼只宇文玥和楚乔在冰湖泡了四年半了,楚乔传2终于开拍了?说起楚乔传大家并不陌生,当年还没播放出来时很多人都不期待,觉得赵丽颖肯定演不好主角,只有我们这些萤火虫在默默期待着盼望着支持着。果然没有辜负我们。当时特别火,播放量近500亿。当时苹果新品销量遇冷,卢伟冰神补刀,库克这回真的搞砸了近日,有权威机构公布了2021年全球智能手机销售排行榜,前十名中,苹果系一家独大,占了7部。华为不在的日子里,无论国内还是国外,手机江湖中苹果俨然有了独孤求败的味道。坐稳了老大的位50分43分!联盟第一!对不起大帝,得分王和MVP他都想要有一首歌是这么唱的三分靠天定,七分靠打拼,爱拼才会赢。NBA赛场有着类似的规律九分靠天定,一分靠打拼,爱拼才会赢!放眼当今联盟,像詹姆斯杜兰特东契奇这种出道即巅峰的天之骄子凤毛麟角随笔进山昨天晚上,当那微凉的晚风吹净了夜空上的浮云,那无云的夜空露出了一弯新月,和众多闪烁的星星后,就决定天亮后要进山里去看山了。当然,这次进山不是去干活,也不是去放牛或砍柴,而纯粹是去放苹果向市场妥协,最便宜5GiPhone来了,你会买吗?北京时间3月9日凌晨2点,苹果2022年春季发布会继续采用线上形式举办。南都记者梳理发现,引起业内和消费者聚焦和热议的主要有以下三方面一是苹果发布的最便宜的5GiPhone,也就是京东面试官Redis这些我必问分布式缓存缓存好处高性能高并发高性能(常用)数据库查询耗费了800ms,其他用户对同一个数据再次查询,假设该数据在10分钟以内没有变化过,并且10分钟之内有1000个用户都查询了同潮汕富豪纪海鹏危机!龙光走到爆雷边缘,债权人怒了作为龙光集团的创始人,潮汕富豪纪海鹏被外界称为,深圳地产圈最神秘的潮汕地产商人。虽然龙光地产规模已超千亿,但他鲜少在公开场合露面。纪海鹏自己估计也没想到,最近走入众人的视野,却是因
文旅部娱乐场所管理办法(全文)中华人民共和国文化和旅游部令第10号文化和旅游部关于修改娱乐场所管理办法的决定已经2022年4月27日文化和旅游部部务会议审议通过,现予公布,自公布之日起施行。部长胡和平2022年一篇关于投资露营的深度文章,有助于让你更好地了解露营项目露营一词火爆于2022年,或许很多的朋友们有计划也想投资项目,关于露营的项目投资,跟大家简单聊聊。投资项目旅游板块的消费热门项目露营。定向客户企业部门聚合车友会网红打卡点家庭活动等茅台酒香溢小满醉美时光在德天高粱渐长麦微黄,醉美茅台好时光。5月21日,广西九界贸易有限公司在亚洲第一大跨国瀑布德天瀑布景区开展了一场别具风格的茅香小满醉美德天53度贵州茅台酒品鉴会。恰逢小满,美酒美景二十四水是人类生命的甘露水是人类生命的甘露。我国古代医学家认为水有助阳气,通经络的功效。现代医学认为,水是构成人体组成的重要部分,人体重的60是水,人体的新陈代谢和生理功能都要水参加,我们每天吃的食物,包准备开抢?美媒列锡安3笔交易方案7换2赴纽约,2换1魔术状元签从进入联盟初的万众瞩目,被誉为下一个詹姆斯,到本赛季陷入舆论风波,饱受球迷与媒体质疑,锡安在进入联盟的3个赛季中一直处于舆论的风口浪尖之中。外界质疑锡安夸张的身材,以及他可怜的出场蔡崇信不惜代价交易詹姆斯篮网湖人讨论方案三个首轮签加西蒙斯纽约每日新闻记者克里斯蒂安温菲尔德最新报道,篮网队总经理肖恩马克斯与湖人队总经理罗伯佩林卡私下会谈,涉及到了勒布朗詹姆斯的交易,篮网队有机会通过交易得到詹姆斯联手凯文杜兰特和凯里欧6月份养老金调整方案,这7类人不涨,需提前了解人人能科普,处处有新知根据今年分工的意见中的要求,到6月底将制定基本养老金调整相关政策,这是否意味着退休人员都可以参与调整?其中这7类人不能享受上涨。一,已经办理延迟退休手续的人到美元联合日元戏耍欧元,人民币麻烦在后头,锚定之物或是关键要说战争打了这么久,欧洲有些人似乎也明白过来一些,美国强行把他们拉上船代价挺大,虽然冲突没有直接波及,但是经济效应凸显的越来越明显。毕竟是老牌资本主义集中地,也没有傻到一定程度,真读万卷书,也要行万里路文让梦想飞扬今天在知乎上有个网友问我看书和旅行哪个会让自己更快得到升华?其实这是我们人生旅途中非常重要的两件事情,我认认真真地回答了粉丝的提问。我非常喜欢某位作家的一句话要么旅行,蔓越莓能改善记忆和预防痴呆?编辑推荐英国东安格利亚大学(UniversityofEastAnglia)的最新研究表明,在饮食中添加蔓越莓有助于改善记忆和大脑功能,并降低有害胆固醇。根据英国东安格利亚大学的一项天路下的木栗园之变戴紫欣中青报中青网记者朱娟娟雷宇落差800余米的峭壁边,7个之字般的天路盘旋而上,像一条银白色的飘带缠绕山间,周边林木葱茏,薄雾缭绕这是初夏时节,湖北省恩施市新塘乡木栗园村壁挂天路