采用策略模式实现订单支付多种方式
背景
项目中订单支付为常见的功能,一般的订单支付都会包含多种方式,例如聚合支付、会员支付、积分支付的等多种方式,如果采用传统的方式来实现,需要使用多个if/else条件判断,本文将介绍如何采用策略+工厂模式实现多种方式的订单支付问题。
简介
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
基本原理
基本元素组成如下:
- 环境 (Context):持有一个策略类的引用,最终给客户端调用。
- 抽象策略 (Strategy): 策略类,通常是一个接口或者抽象类。
- 具体策略 (ConcreteStrategy):实现了策略类中的策略方法,封装相关的算法和行为。
具体实现
定义抽象策略
public interface PayWayService
{Result pay(WxPayObject wxpayObject);
}
说明:定义抽象支付接口。
具体策略
微信支付
@Component("wx")
public class WxPayWayServiceImpl implements PayWayService
{private Logger logger = LoggerFactory.getLogger(WxPayWayServiceImpl.class);@Overridepublic Result pay(WxPayObject wxPayObject){logger.info("this is wx pay way");return Result.success(wxPayObject);}
}
说明:注意@Component注解需要写入别名。
支付宝支付
@Component("zfb")
public class ZfbPayWayServiceImpl implements PayWayService
{private Logger logger = LoggerFactory.getLogger(ZfbPayWayServiceImpl.class);@Overridepublic Result pay(WxPayObject wxpayObject){logger.info("this is zfb pay way");return Result.success(wxpayObject);}
}
会员支付
@Component("member")
public class MemberPayWayServiceImpl implements PayWayService
{private Logger logger = LoggerFactory.getLogger(MemberPayWayServiceImpl.class);@Overridepublic Result pay(WxPayObject wxpayObject){logger.info("this is member pay way");return Result.success(wxpayObject);}
}
工厂类
@Component
public class PayWayFactory
{@Autowiredprivate Map<String, PayWayService> paywayServiceMap;public PayWayService getPayWayService(String type) {PayWayService payWayService = paywayServiceMap.get(type);if(payWayService==null){throw new RuntimeException("未指定的支付类型");}return payWayService;}
}
说明:通过工厂类获取具体的策略实现。
private Map<String, PayWayService> paywayServiceMap
@Autowired 标注作用于Map类型时,如果Map的key为String类型,则Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 iD 或 name 作为Map的key。
测试
@RestController
public class TestController
{@Autowiredprivate PayWayFactory payWayFactory;@RequestMapping("/getPayWay")public void getPayWay(@RequestParam String payWay){WxPayObject wxpayObject =new WxPayObject();payWayFactory.getPayWayService(payWay).pay(wxpayObject);}
}
输入 payway分别输入wx和member输出结果如下:
策略模式优缺点
优点
- 提供了管理相关的算法族的办法,从而避免重复的代码。
- 提供了可以替换继承关系的办法。因为继承使得动态改变算法或行为变得不可能。
- 可以避免使用多重条件转移语句。
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。
总结
本文对策略模式进行了讲解,策略模式在实际开发过程中应用的比较广泛,所以大家还是需要熟练的掌握其用法,如有疑问,请随时反馈。
采用策略模式实现订单支付多种方式相关推荐
- 【设计模式实践系列】策略模式应用订单折扣方案
策略模式 策略模式指的是一个类的行为或其算法可以在运行时更改,在不同的场景中,有不同的实现算法. 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情 ...
- 精讲23种设计模式-策略模式~聚合短信服务和聚合支付服务
文章目录 一.设计模式 1. 为什么需要使用设计模式 2. 设计模式的分类 3. 什么是策略模式 4. 为什么叫做策略模式 5. 策略模式优缺点 6. 策略模式应用场景 7. Spring框架中使用的 ...
- 换个姿势学设计模式:策略模式
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...
- 研磨设计模式之 策略模式--转
http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式 2010-09-09 作者:云飞龙行 来源:云飞龙行的blog 先感谢众多朋友的支持 ...
- 设计模式—策略模式(Strategy Pattern)
上午花了一个小时看了这篇关于策略模式的博文,例子生动.内容具体.值得一看(http://www.uml.org.cn) .转发这篇微博,只为互相学习. 策略模式(Strategy) 1 场景问题 1 ...
- 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式
前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...
- 策略模式(解决多重if判断问题)
什么是策略模式? 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决多重if判断问题. 1.环境(Context)角色:持有一个Strategy的引用 ...
- 策略模式的理解与应用
策略模式的理解 策略模式 什么是策略模式 策略模式的重点理解 简单代码示例 策略模式图解 策略模式的优势 策略模式的使用场景 总结 策略模式 什么是策略模式 策略模式(Strategy Pattern ...
- 【设计模式】 模式PK:策略模式VS状态模式
1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...
最新文章
- mysql 的默认数据库mysql为什么在 workbench下看不到?
- 你真的会学习吗?从结构化思维说起
- 【已解决】R语言,在线升级
- 开源 | 如何实现一个iOS AOP框架?
- WiFi攻击中的“核武器”长啥样?来,今天咱们开开眼...
- 【解析】在设计软件的模块结构时,()不能改进设计质量
- 深度学习推荐模型-NFM
- 编译OpenJDK8:error: control reaches end of non-void function [-Werror=return-type]
- 单循环赛 贝格尔编排法实现
- could not find function 函数名
- 设置按峰值带宽计费_一个公式告诉你CDN适合带宽计费还是流量计费
- 2018中国民营企业500强榜单
- 微信小程序客服介绍:如何设置小程序在线客服?
- 微信扫码支付dome php,帝国cms 微信扫码支付 模式二 扫码付款demo
- VsCode新建VueJs项目的详细步骤
- Mac显示/隐藏文件夹
- 关于计算机方面的知识小故事,「计算机小故事」-奇妙的HelloWorld任务
- 房源管理系统php,房产中介房源管理系统 v1.1
- 页面组成、表格、博客、图片、列表
- 通过棘轮轻松实现原型移动应用程序
热门文章
- Java逐行读取fasta文件
- YOLOv1论文中英文对照翻译
- 【Little Demo】从简单的Tab标签到Tab图片切换
- 用Notepad++ 宏功能 将json数据转换为EXCEL
- TextSeek使用教程(初级篇) - 文件搜索软件
- python怎么选取不连续的列_python – Pandas从数据帧中选择不连续的列
- 秦曾昌人工智能课程---1、机器学习中的数学基础
- 软件加入使用时间_【安卓】换了这么多影视软件,还是这个老牌站点最靠谱
- python循环3次停止_【Python】quot;为所欲为quot;怎么成语接龙?
- 裁员潮,带给我的思考