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

Springboot运用策略模式实现,避免多次使用if

  前言
  这里就不详细去介绍策略模式是怎么样的了,想了解的可以点击下面的链接
  策略模式介绍的链接:策略模式的介绍
  这里列出策略模式的好处
  场景:某网页有个支付,其中包含了微信、支付宝等方式的支付方式 ,后续明确还会进行兼容其他的支付方式
  用策略模式的好处:避免多次使用if判断具体是用哪种支付策略进行操作。因为每种策略(微信支付、支付宝支付)的内容都比较复杂。策略模式能将每种策略分离出来,方面后续维护管理
  下面我们将使用Spring boot 运用策略模式,实现上面的需求环境配置JDK8Spring boot 2.3.7.RELEASE整合了spring-boot-starter-web实现目标
  使用策略模式后,新加一种支付策略时,只需要在策略枚举中添加新加的策略信息,外加一个策略类即可,而不再需要添加新的if判断。准备策略接口和具体实现策略类支付策略接口/**  * 支付策略  */ public interface PayStrategy {      /**      * 支付(参数就没具体写了,可以定义成每个支付必须要有的参数)      * @return      */      boolean pay(); } 复制代码微信支付策略类/**  * 第三方——微信支付(这里注意我修改了Bean的默认命名)     */ @Component("wechatPayStrategy") public class WeChatPayStrategyImpl implements PayStrategy{      /**      * 支付      * @return      */     @Override     public boolean pay() {          //进行微信的支付逻辑         System.out.println("正在进行微信的支付逻辑");          return true;     } } 复制代码支付宝支付策略类 /**  * 支付宝第三方支付(这里注意我修改了Bean的默认命名)  */ @Component("alipayStrategy") public class AliPayStrategyImpl implements PayStrategy {      /**      * 支付宝支付      * @return      */     @Override     public boolean pay() {          //进行支付宝支付逻辑         System.out.println("进行支付宝支付逻辑");         return true;     } } 复制代码
  上述已将各自的策略的处理类进行了分离,接下来时使用支付策略工厂类和支付策略上下文将各自的策略类联系起来准备支付策略上下文Context和支付策略工厂类支付策略工厂类package com.example.springboot_strategy.strategy.factory;  import com.example.springboot_strategy.enums.PayStrategyEnum; import com.example.springboot_strategy.strategy.PayStrategy; import org.springframework.stereotype.Component;  import javax.annotation.Resource; import javax.swing.plaf.synth.SynthTextAreaUI; import java.util.Map;  /**  * 支付策略工厂类  */ @Component public class PayStrategyFactory {      /**      * 通过Spring容器的方式注入      */     @Resource     private Map payStrategyMap;      /**      * 获取对应支付策略类      * @param payStrategyEnum 支付策略枚举      */     public PayStrategy getPayStrategy(PayStrategyEnum payStrategyEnum){          if(!payStrategyMap.containsKey(payStrategyEnum.getClassName())){             System.out.println("没有对应的支付策略,无法进行支付");             return null;         }          return payStrategyMap.get(payStrategyEnum.getClassName());     } } 复制代码
  这里工厂类的逻辑是利用了Spring容器的处理方式,如果有多种类同时实现了某个接口,那么可以使用Map集合接收,Map对应的泛型,String是Bean名称,PayStrategy是每个具体实现类,这样我们就可以使用Bean类型去指定具体的策略类了,然后建立一个支付策略枚举去管理这些Bean名称。同时,也可以将Bean名称与客户端定义的类型进行关联。支付策略枚举类/**  * 支付策略类型  */ public enum PayStrategyEnum {     WECHAT_PAY("wechat","wechatPayStrategy","微信支付"),     ALIPAY("alipay","alipayStrategy","支付宝支付")     ;      /**      * 支付策略code      */     private String code;      /**      * bean名称      */     private String className;      /**      * 信息      */     private String info;      PayStrategyEnum(String code,String className,String info){         this.code=code;         this.className=className;         this.info=info;     }       public String getCode() {         return code;     }      public String getClassName() {         return className;     }      public String getInfo() {         return info;     }   } 复制代码
  上面枚举类中code代表的是客户端定义的类型(例如我从前端接收到的支付type,这个type可以是这个code),className顾名思义,指的是每种策略的bean名称,info是代表每种策略的内容支付策略上下文/**  * 支付策略上下文  */ @Component public class PayStrategyContext {          @Autowired     private PayStrategyFactory payStrategyFactory;      /**      * 支付执行      * @param payDTO 支付参数      * @return      */     public boolean payHandle(PayDTO payDTO){                 //将某属性的值转换成具体的枚举。这里是根据payDTO的type字段对应枚举的code进行转换         Optional payStrategyEnumOptional = Arrays.stream(PayStrategyEnum.class.getEnumConstants())                 .filter((e) -> e.getCode().equals(payDTO.getType())).findAny();          if(!payStrategyEnumOptional.isPresent()){             System.out.println("匹配不到具体支付策略");             return false;         }         PayStrategyEnum payStrategyEnum = payStrategyEnumOptional.get();          PayStrategy payStrategy = payStrategyFactory.getPayStrategy(payStrategyEnum);          //进行payDto参数的处理.....          boolean pay = payStrategy.pay();          //支付后的记录处理..           return true;              } } 复制代码pageDto类/**  * 支付DTO  */ public class PayDTO {      /**      * 支付类型      */     private String type;       /**      * 支付金额      */     private BigDecimal payMoney;          /**      * ...........      */       public String getType() {         return type;     }      public void setType(String type) {         this.type = type;     }      public BigDecimal getPayMoney() {         return payMoney;     }      public void setPayMoney(BigDecimal payMoney) {         this.payMoney = payMoney;     }  } 复制代码
  这个策略上下文,则是选择策略的入口,这里会进行参数的处理,将这里我就将pageDTO类中的type字符串转换成对应的枚举类。
  到这里使用策略模式的编写算是完成了,下面进行编写客户端的代码客户端代码支付控制器@RestController @RequestMapping("pay") public class PayController {      @Autowired     private PayStrategyContext payStrategyContext;      @PostMapping     public boolean pay(@RequestBody PayDTO payDTO){              //这里因为懒…就没有加上Service层了,直接在控制器处理         return payStrategyContext.payHandle(payDTO);     } } 复制代码效果
  新需求
  后续新增一个银联的支付方式,我们只需要添加银联的支付策略类和添加银联的支付枚举即可实现添加银联的支付策略类 /**  * 银联支付(这里注意我修改了Bean的默认命名)  */ @Component("unionPayStrategy") public class UnionPayStrategyImp implements PayStrategy {       /**      * 银联支付      * @return      */     @Override     public boolean pay() {          //进行银联的支付          System.out.println("进行银联的支付逻辑");         return true;     }  } 复制代码在枚举类中添加银联的支付枚举/**  * 支付策略类型  */ public enum PayStrategyEnum {     WECHAT_PAY("wechat","wechatPayStrategy","微信支付"),     ALIPAY("alipay","alipayStrategy","支付宝支付"),     UNION_PAY("unionpay","unionPayStrategy","银联支付")     ;      /**      * 支付策略code      */     private String code;      /**      * bean名称      */     private String className;      /**      * 信息      */     private String info;      PayStrategyEnum(String code,String className,String info){         this.code=code;         this.className=className;         this.info=info;     }       public String getCode() {         return code;     }      public String getClassName() {         return className;     }      public String getInfo() {         return info;     }   } 复制代码实现效果
  以上是我使用Spring boot 运用策略模式实现的效果,如果有误人子弟的地方,望在评论区指出。

铃木第一辆纯电动汽车EVX概念车印度首发,搭载比亚迪刀片电池随着电气化在全球范围内展开,铃木也在积极推进电动化事业。而在近日,在印度德里车展上,铃木第一辆纯电动汽车EVX概念车亮相。值得一提的是,新车的量产版本将于2025年开始生产。而最为reduce后端设计在进行reduce软件设计的时候,我希望尽量保证软件操作的简单性。通过一些巧妙的设计可以避免设计出复杂的软件,因此数据结构需要被文档化。值得注意的是,这是reduce软件的v0。1单季盈利破百亿!宁王商业版图盘点对外投资超百家CNMO新闻作为动力电池行业的龙头企业,宁德时代的一举一动都备受瞩目。日前,宁德时代发布2022年年度业绩预告,预计净利润将达291亿元至315亿元,同比增长82。7至97。7预计雷军,全力造车花朵财经原创2014年,小米以全年销售6112万部手机,首次夺得全国销冠。意气风发的雷军,在年终时写道去到别人连梦想都未曾抵达的地方。同年,在乌镇首届世界互联网大会上,雷军撂下豪言想用华为,又想用二代骁龙85G?看看新机荣耀Magic5怎么样?外媒爆料人SPinfoJP在知名社交平台上晒出清晰的荣耀旗舰系列Magic5(魔法5)渲染图,三摄套餐,最高支持100倍(数字)变焦,看来潜望长焦还是3。5倍,5倍的潜望通常能拉到创领新能源越野坦克500PHEV盛势亮相海口车展2023年1月6日,第五届海口新能源暨智能网联车展在海南国际会展中心盛大启幕,作为坦克品牌首款新能源越野SUV,坦克500PHEV车型迎来重磅亮相,真正将越野新能源的技术路线落到实已灭绝多年的物种,近年来频频死而复生,玛雅预言要成真?地球生命的灭绝无法避免地球已经存在了46亿年,其中生命诞生于这颗星球上的时间,也足足有30多亿年。在这30多亿年里,地球上的生命经历了从无到有从少到多从简单到复杂从低级到高级的演化精确控制分子化学键方向,让化学反应不再抽盲盒北京日报客户端记者刘苏雅精确调控化学反应,是化学科学研究的核心目标之一。围绕在原子分子尺度和量子态等微观水平层面进一步发展精确调控化学反应的原理和方法,中国科学院大连化学物理研究所2022年中国十大科技进展新闻揭晓光明日报记者袁于飞1月12日,数百名中国科学院院士和中国工程院院士投票评选的2022年中国十大科技进展新闻当日在北京揭晓,每一项科技进展都是我国2022年科技成果的优秀代表,展现了小米京东等大厂延迟发放年终奖,企业为何争相摆烂?临近年关,以往年的节奏来看互联网大厂都会在过年前发放年终奖,但是在互联网寒冬之下,当前的情况与往年有了些许差别。小米年终延迟到3月发放微博年终推迟百度ACE取消年终和绩效评比互联网小心!这些上市公司掐点变更审计机构,大所换小所遭监管追问记者庞宇编辑行至岁末,有人欢喜有人愁。A股上市公司2022年度业绩预告正在如火如荼披露中,而对于部分上市公司而言,掐点变更审计机构成为当务之急。据界面新闻统计,2022年12月以来
普京到中东了!将与伊朗土耳其领导人会晤据伊朗国家电视台(IRIB)19日报道,俄罗斯总统普京已抵达伊朗首都德黑兰,开始对伊朗进行工作访问,普京将于今天同伊朗总统莱希举行会谈,并与伊朗和土耳其领导人共同参加旨在促进叙利亚许久不联系的人,突然联系你了,逃不过这3个原因听过一句话人一生会遇到8263563人,会打招呼的是39778人,会和3619人熟悉,会和275人亲近,但最终都会消散在人海。也许吧,人生就是一个聚散离合的过程,有人相遇,也就有人胡先煦手写问答卷曝光,18个字写错3个,取消笔试考编再惹争议小镇做题家与明星考编可谓是最近相当火热的话题了,演员岗免笔试考入事业编,而普通人却要完成笔试,这就让文化能力成为很多网友争议的点。近日,有博主晒出胡先煦的一段手写问卷问答,各种错别天眼查解密唐山老汉城烧烤店老板娘王亚娟陈继志背后信息唐山烧烤店打人事件已经过去一个多月了,从事件发生至今,网络上流传着各种版本的传言,民众对四个女孩的下落也是感到万分焦急,虽然官方也对打人事件做出了官方回应,但是其中的种种疑惑始终萦节能置业3。6亿债务逾期,公司债即将到期能否兑付?当代置业美元债加速到期,节能置业涉多起被执行立案,且被纳入失信被执行人,其子公司股权被冻结,公司经营和信用状况进一步恶化。01hr债务逾期7月18日,当代节能置业股份有限公司(以下中基优选私募基金50指数周报来了一市场回顾上周,国内外市场波动降低。美国方面,中美高层对话虽然已成常态化机制,但本次通话并未释放明确会谈成果,市场关注的取消对华加征关税问题依然悬而未决,市场在空档期趋向稳定。国内速看!海南省中等学校招生提前批投档分数线出炉新海南客户端南海网南国都市报7月19日消息(记者黄婷实习生吴祖杭)7月19日,海南省考试局发布2022年海南省中等学校招生提前批投档分数线(一)(二),28所学校提前批投档分数线出油价下调已定!今天7月19日,全国油价调整后9295汽油价格今天7月19日星期二,2022年第14轮国内油价调整大局已定!因为虽然新定价机制规定,当汽柴油调价幅度低于每吨50元时,不作调整,纳入下次调价时累加或冲抵,但很明显这一规则不适用于10到50!零封一条龙,女足姑娘打服台北女足,东亚杯首胜稳了2022年农历大年初一,中国男足耻辱性地13惨败鱼腩越南队,中国足球遭受前所未有的打击,一夜回到解放前,让人看不到一丝丝希望。正当中国足球处于如此黑暗时刻,中国女足姑娘们挺身而出,丑男杜旭东和妻子结婚40年,支持怀孕女儿离婚,为她找幸福前言杜旭东是一个优秀的反派演员,他先后出演过大宅门中的无赖韩荣发,神医喜来乐中的奸商孟庆合,大宋提刑官中的唐二宝,别拿豆包不当干粮中的大嘴叉子査宝库,雪豹中的清风寨二当家等等,因为银行定期存款,有本子和无本子有何区别?各位朋友需熟知俗话说得好手有余粮而心不慌。存钱自古以来就是中国人的习惯和传统。近年来,银行制度的不断发展,使得其业务更加的广泛和完善,因此越来越多的人选择在银行存款。国家也进行了非常严格的调整和