本文代码已提交至Github(版本号:dd2a1cfed9cd936853ee8b28fa9ca05eb61d25a4
),有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop
在上一篇博客《淘东电商项目(57) -聚合支付(支付令牌接口)》,已经讲解完了如下图的第1~4个步骤,接下来本文要讲解第5个步骤,选择支付方式提交后,后台使用设计模式来实现自动跳转到对应的支付接口,如选择“银联支付”,请求后台后,自动跳转到银联支付的实现,选择“支付宝支付”,自动跳转到支付宝支付的实现。同时,在后台新增新的支付方式,直接增加一个支付实现类就可以了,得益于设计模式,减少了if else
的编写。
本文目录结构: l____引言 l____ 1. 为什么要使用设计模式? l____ 2. 支付策略的代码原理 l____ 3. 设计模式的实现 l____ 4. 测试
1. 为什么要使用设计模式?在上一篇博客,我们根据token获取支付详情页面如下: 可以看到上图有两种支付方式,分别是“银联支付”和“支付宝支付”,如果我们写后台的代码,是怎样的呢?伪代码如下:
if("yinlian_pay".equals(CHANNEL_ID)){
//银联支付的具体实现
}else if("ali_pay".equals(CHANNEL_ID)){
//支付宝支付的具体实现
}
可以看到,如果将来有新的需求,需要增加“微信支付”或者“小米支付”,那岂不是要写很多的if else?那该如何解决这个问题呢?这个时候用到了策略模式。关于策略模式,之前我也有写过博客,有兴趣的同学可以参考下:《设计模式1 - 策略模式【Strategy Pattern】》或者《设计模式系列教程(13) - 策略模式》
2. 支付策略的代码原理下面用文字描述下针对多种支付,策略模式的使用流程:
- 首先用户在页面确认完订单,选择支付方式后,会提交一个参数channelId,用来表示支付类型。
- 后台接收到channelId后,会根据channelId去查询数据库,查询对应的实现的类路径,如:channelId为“ali_pay”的类路径为“com.ylw.service.impl.AliPayContextImpl”。
- 通过反射,传入对应的类路径,生成实例。
- 由于可能会多次调用,所以可以使用工厂模式,对应的实现类只需要生成一次即可,不用每次请求,每次反射生成。
从上面的描述,可以看到用到的设计模式有“策略模式”和“工厂模式”。下面来讲解具体的代码实现。
3. 设计模式的实现策略模式会模式涉及到三个角色:
- 环境(Context)角色:持有一个Strategy的引用。
- 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
①先看看抽象策略角色PayStrategy:
/**
* description: 支付接口共同实现行为算法
* create by: YangLinWei
* create time: 2020/5/13 4:41 下午
*/
public interface PayStrategy {
/**
* @param pymentChannel 渠道参数
* @param payMentTransacDTO 支付参数
* @return
*/
public String toPayHtml(PaymentChannelEntity pymentChannel, PayMentTransacDTO payMentTransacDTO);
}
②具体策略角色(ConcreteStrategy,支付宝与银联):
/**
* description: 支付宝支付渠道
* create by: YangLinWei
* create time: 2020/5/13 4:41 下午
*/
@Slf4j
public class AliPayStrategy implements PayStrategy {
@Override
public String toPayHtml(PaymentChannelEntity pymentChannel, PayMentTransacDTO payMentTransacDTO) {
log.info(">>>>>支付宝参数封装开始
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?