专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

  前言
  这里就不详细去介绍策略模式是怎么样的了,想了解的可以点击下面的链接
  策略模式介绍的链接:策略模式的介绍
  这里列出策略模式的好处
  场景:某网页有个支付,其中包含了微信、支付宝等方式的支付方式,后续明确还会进行兼容其他的支付方式
  用策略模式的好处:避免多次使用if判断具体是用哪种支付策略进行操作。因为每种策略(微信支付、支付宝支付)的内容都比较复杂。策略模式能将每种策略分离出来,方面后续维护管理
  下面我们将使用Springboot运用策略模式,实现上面的需求环境配置JDK8Springboot2。3。7。RELEASE整合了springbootstarterweb实现目标
  使用策略模式后,新加一种支付策略时,只需要在策略枚举中添加新加的策略信息,外加一个策略类即可,而不再需要添加新的if判断。准备策略接口和具体实现策略类支付策略接口支付策略publicinterfacePayStrategy{支付(参数就没具体写了,可以定义成每个支付必须要有的参数)returnbooleanpay();}复制代码微信支付策略类第三方微信支付(这里注意我修改了Bean的默认命名)Component(wechatPayStrategy)publicclassWeChatPayStrategyImplimplementsPayStrategy{支付returnOverridepublicbooleanpay(){进行微信的支付逻辑System。out。println(正在进行微信的支付逻辑);returntrue;}}复制代码支付宝支付策略类支付宝第三方支付(这里注意我修改了Bean的默认命名)Component(alipayStrategy)publicclassAliPayStrategyImplimplementsPayStrategy{支付宝支付returnOverridepublicbooleanpay(){进行支付宝支付逻辑System。out。println(进行支付宝支付逻辑);returntrue;}}复制代码
  上述已将各自的策略的处理类进行了分离,接下来时使用支付策略工厂类和支付策略上下文将各自的策略类联系起来准备支付策略上下文Context和支付策略工厂类支付策略工厂类packagecom。example。springbootstrategy。strategy。factory;importcom。example。springbootstrategy。enums。PayStrategyEnum;importcom。example。springbootstrategy。strategy。PayStrategy;importorg。springframework。stereotype。Component;importjavax。annotation。Resource;importjavax。swing。plaf。synth。SynthTextAreaUI;importjava。util。Map;支付策略工厂类ComponentpublicclassPayStrategyFactory{通过Spring容器的方式注入ResourceprivateMapString,PayStrategypayStrategyMap;获取对应支付策略类parampayStrategyEnum支付策略枚举publicPayStrategygetPayStrategy(PayStrategyEnumpayStrategyEnum){if(!payStrategyMap。containsKey(payStrategyEnum。getClassName())){System。out。println(没有对应的支付策略,无法进行支付);returnnull;}returnpayStrategyMap。get(payStrategyEnum。getClassName());}}复制代码
  这里工厂类的逻辑是利用了Spring容器的处理方式,如果有多种类同时实现了某个接口,那么可以使用Map集合接收,Map对应的泛型,String是Bean名称,PayStrategy是每个具体实现类,这样我们就可以使用Bean类型去指定具体的策略类了,然后建立一个支付策略枚举去管理这些Bean名称。同时,也可以将Bean名称与客户端定义的类型进行关联。支付策略枚举类支付策略类型publicenumPayStrategyEnum{WECHATPAY(wechat,wechatPayStrategy,微信支付),ALIPAY(alipay,alipayStrategy,支付宝支付);支付策略codeprivateStringcode;bean名称privateStringclassName;信息privateStringinfo;PayStrategyEnum(Stringcode,StringclassName,Stringinfo){this。codecode;this。classNameclassName;this。infoinfo;}publicStringgetCode(){returncode;}publicStringgetClassName(){returnclassName;}publicStringgetInfo(){returninfo;}}复制代码
  上面枚举类中code代表的是客户端定义的类型(例如我从前端接收到的支付type,这个type可以是这个code),className顾名思义,指的是每种策略的bean名称,info是代表每种策略的内容支付策略上下文支付策略上下文ComponentpublicclassPayStrategyContext{AutowiredprivatePayStrategyFactorypayStrategyFactory;支付执行parampayDTO支付参数returnpublicbooleanpayHandle(PayDTOpayDTO){将某属性的值转换成具体的枚举。这里是根据payDTO的type字段对应枚举的code进行转换OptionalPayStrategyEnumpayStrategyEnumOptionalArrays。stream(PayStrategyEnum。class。getEnumConstants())。filter((e)e。getCode()。equals(payDTO。getType()))。findAny();if(!payStrategyEnumOptional。isPresent()){System。out。println(匹配不到具体支付策略);returnfalse;}PayStrategyEnumpayStrategyEnumpayStrategyEnumOptional。get();PayStrategypayStrategypayStrategyFactory。getPayStrategy(payStrategyEnum);进行payDto参数的处理。。。。。booleanpaypayStrategy。pay();支付后的记录处理。。returntrue;}}复制代码pageDto类支付DTOpublicclassPayDTO{支付类型privateStringtype;支付金额privateBigDecimalpayMoney;。。。。。。。。。。。publicStringgetType(){returntype;}publicvoidsetType(Stringtype){this。typetype;}publicBigDecimalgetPayMoney(){returnpayMoney;}publicvoidsetPayMoney(BigDecimalpayMoney){this。payMoneypayMoney;}}复制代码
  这个策略上下文,则是选择策略的入口,这里会进行参数的处理,将这里我就将pageDTO类中的type字符串转换成对应的枚举类。
  到这里使用策略模式的编写算是完成了,下面进行编写客户端的代码客户端代码支付控制器RestControllerRequestMapping(pay)publicclassPayController{AutowiredprivatePayStrategyContextpayStrategyContext;PostMappingpublicbooleanpay(RequestBodyPayDTOpayDTO){这里因为懒就没有加上Service层了,直接在控制器处理returnpayStrategyContext。payHandle(payDTO);}}复制代码效果
  新需求
  后续新增一个银联的支付方式,我们只需要添加银联的支付策略类和添加银联的支付枚举即可实现添加银联的支付策略类银联支付(这里注意我修改了Bean的默认命名)Component(unionPayStrategy)publicclassUnionPayStrategyImpimplementsPayStrategy{银联支付returnOverridepublicbooleanpay(){进行银联的支付System。out。println(进行银联的支付逻辑);returntrue;}}复制代码在枚举类中添加银联的支付枚举支付策略类型publicenumPayStrategyEnum{WECHATPAY(wechat,wechatPayStrategy,微信支付),ALIPAY(alipay,alipayStrategy,支付宝支付),UNIONPAY(unionpay,unionPayStrategy,银联支付);支付策略codeprivateStringcode;bean名称privateStringclassName;信息privateStringinfo;PayStrategyEnum(Stringcode,StringclassName,Stringinfo){this。codecode;this。classNameclassName;this。infoinfo;}publicStringgetCode(){returncode;}publicStringgetClassName(){returnclassName;}publicStringgetInfo(){returninfo;}}复制代码实现效果
  以上是我使用Springboot运用策略模式实现的效果,如果有误人子弟的地方,望在评论区指出。

23年湖南专升本政策发布及改革方向时间来到了11月份,距离湖南专升本政策发布时间还有两个月左右,届时23届同学们的一系列问题也会迎刃而解。不过在此之前,根据22年专升本政策和最新的政策进行了解读和对23年政策的预测中国航天又创造了一项世界纪录11月12日12时10分,发射升空仅约两小时的天舟五号货运飞船,与空间站核心舱顺利完成后向对接,中国空间站T字构型组合体与天舟货运飞船的首次交会对接任务取得圆满成功!这场持续仅约两凝心聚力促工作发展张家界慈利卫健系统学习贯彻二十大精神授课现场。红网时刻新闻11月11日讯(通讯员王健)11月10日,张家界市慈利县委卫健工委组织召开全系统学习贯彻党的二十大精神授课会,会议特邀慈利县委宣讲团成员县委党校教育长陈娟进行2019年,洪都拉斯总司令为了寻找亲哥哥,66岁首次回到了中国老家2019年5月,广东省江门市的三兴村迎来了一位特殊的客人,只见他身材高大,皮肤黝黑,活脱脱一个外国人的相貌。当他看到一个头发花白的老人朝他挥手时,他忍不住与之拥抱,还流下了眼泪。哥毛姆面纱婚姻的3个真相,越早明白越好读者海外版杂志全年订阅240购买我知道你愚蠢轻佻头脑空虚,然而我爱你。我知道你的企图你的理想,你势利庸俗,然而我爱你。这是毛姆小说面纱中的经典台词。毒舌毛姆被称为英国最会讲故事卡塔尔世界杯32强巡礼之H组洲际冠军齐聚首京报体育记者李立本届世界杯H组的4支球队分别来自四个大洲,且都获得过各自大洲的冠军,是名副其实的洲际冠军之组。葡萄牙队C罗谢幕演出能否圆梦葡萄牙队即将第八次登上世界杯舞台,对于37世界杯最后一支参赛球队终确定!厄瓜多尔被裁定违规,但资格不变本届世界杯即将于本月20日开打,但最后一个参赛名额却直到现在才被正式确定。国际体育仲裁法庭(CAS)裁定厄瓜多尔队存在违规,但该队的世界杯资格不变,球队将在下届世预赛中遭到处罚。厄国土空间规划中的临潼旅游度假区关于度假区的定位西安市国土空间总体规划(20212035年)草案已经在官网进行了公示,在公示的草案中,对临潼度假区有了具体的定位,从图中可以看出,临潼度假区定位成了风貌协调区,再看旅游,是对压缩到一张明信片上的世界的象征性占有五岳寻仙不辞远,一生好入名山游。读过李白的诗,除了佩服他的下笔有神豪兴万丈,也不禁羡慕他能够游遍祖国大好河山。在交通如此不发达的古代,文人墨客能够四处游历增广见闻,从而留下了千古流数字化门店到底是什么?近年来,各行各业,包括央视新闻都反复提到数字化门店,倡导门店的数字化转型。那么数字化门店到底是什么呢?通俗地来说,就是线下门店与互联网相结合所形成的新型门店。数字化门店已经逐渐进入小马何日长成良骏?近日,备受瞩目的小马智行再起波澜,裁员风波流出。本应在自动驾驶赛道上跑出加速度的新兴产业,最近频频带来慢节奏的消息。萦绕在这支被寄予厚望的自动驾驶新军上悬而未决的问题是小马何时能长
江西省水文监测中心发布干旱橙色预警来源央视新闻客户端9月22日10时30分,江西省水文监测中心发布干旱橙色预警7月以来,江西持续干旱少雨,降雨量较常年同期偏少6成,五河入湖水量偏少近6成。受降雨偏少及长江干流水位偏庆丰收丰收的账本视频加载中卖鸽子赚了8150块钱,我这一亩地能收入6000多块钱,今年第一季的西兰花产出有6800多斤,然后3块2一斤的平均价,然后算下来有21800多块钱。这是来自三位普通农民的戴尔Latitude5330二合一笔记本混合办公下的小巧生产力随着混合办公时代的到来,人们的办公地点已不再局限在小小的办公室内,地铁飞机出租车家中的客厅奶茶店,都有可能成为办公的场所。尤其是对于企业的中坚力量来说,他们不仅关心着科技产品的性能红米Note12Max突破千元机极限,超级窄边屏天玑9000,诚意满满在国内手机市场,性价比手机一直经久不衰,强悍的性能亲民的价格,深受普通用户欢迎。同价位机型中,用户更青睐性能强劲综合实力雄厚的机型。红米手机的性价比有目共睹,自动与小米分离之后,专iOS16。0。2拉胯?大反转,果粉纷纷打脸,续航逆天,真香iOS16。0。2正式版刚发布出来,很多用户都在喷这个版本很拉胯,确实新系统刚升级需要重启一次再用几天来进行适配,才会获得更好的体验,这不,大反转来了,很多果粉体验了几天后,表示iiPhone14Pro再现重大BUG充电会自动重启近日,网络爆料显示,iPhone14Pro再次出现重大BUG,有部分用户称,自己的iPhone14Pro在通过MagSafe或Lightning充电时,会毫无征兆的出现间歇性重启。苹果可能要取消10月份的发布会?新款iPadMac将直接上架官网苹果在秋季发布会上推出新iPhone等产品之后,原计划在10月份再举办一场特别活动,推出新款iPadMacBookPro等新品。不过根据苹果知名爆料大神MarkGurman的最新消iOS16。0。2被更多人认可!续航水平提升至新高度,信号趋于稳定iOS16。0。2正式版是上周五苹果紧急推送的小版本更新,虽说这是小版本升级,但苹果这次突显诚意,带来十足的优化,不仅降低了复制粘贴的弹窗,还优化了部分机型的电池续航等一系列性能提骨传导会损伤听力吗,骨传导耳机对于耳道的伤害到底是多少?提到骨传导耳机相信大多数人还是一知半解,而骨传导耳机之所以在近些年迅速崛起的原因得益于巧妙的运用了发声原理,并且解决了大家都头疼的关于长时间佩戴耳机对于耳朵的伤害问题。作为第一时间VR设备能否替代手机,成为消费新需求?看完PICO4答案很明显手机销售乏力的原因之一,是如今手机已经做到人手一台,再加上创新放缓,人们换机意愿也逐渐降低。因此厂商急需一种新的消费品,能引发新的消费需求,而VR设备便承接了这其中一部分的重任。就索尼A7和iPhone14ProMax拍照对比3300万像素和4800万像素谁更强索尼A7是一款全画幅微单,并且上市之后受到了消费者的欢迎,在市面上的销量也非常不错。索尼A7的有效像素为3300万像素,而iPhone14ProMax的主摄像素为4800万像素,那
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网