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月以来