使用策略模式实现支付方式选择场景
为了加深对策略模式的理解,本节在来学习一个实例。相信小伙伴们都用过支付宝、微信支付、银联支付及京东白条,常见的应用场景就是大家在下单支付时会提示选择支付方式,如果没有选择支付方式,系统会用默认推荐的支付方式进行结算。
下面我们使用策略模式来模拟此业务场景,类图如下。
首先创建 Payment 抽象类,定义支付规范和支付逻辑,代码如下。
下面我们使用策略模式来模拟此业务场景,类图如下。
public abstract class Payment { public abstract String getName(); //通用逻辑放到抽象类里面实现 public MsgResult pay(String uid, double amount) { //余额是否足够 if (queryBalance(uid) < amount) { return new MsgResult(500, "支付失败", "余额不足"); } return new MsgResult(200, "支付成功", "支付金额" + amount); } protected abstract double queryBalance(String uid); }然后分别创建具体的支付方式,支付宝 AliPay 类的代码如下。
public class AliPay extends Payment { public String getName() { return "支付宝"; } protected double queryBalance(String uid) { return 900; } }京东白条 JDPay 类的代码如下。
public class JDPay extends Payment { public String getName() { return "京东白条"; } protected double queryBalance(String uid) { return 500; } }微信支付 WeChatPay 类的代码如下。
public class WeChatPay extends Payment { @Override public String getName() { return "微信支付"; } @Override protected double queryBalance(String uid) { return 263; } }银联支付 UnionPay 类的代码如下。
public class UnionPay extends Payment { @Override public String getName() { return "银联支付"; } @Override protected double queryBalance(String uid) { return 120; } }创建支付状态的包装类 MsgResult。
public class MsgResult { private int code; private Object data; private String msg; public MsgResult(int code, String msg, Object data) { this.code = code; this.data = data; this.msg = msg; } @Override public String toString() { return "MsgResult{" + "code=" + code + ", data=" + data + ", msg='" + msg + '\'' + '}'; } }创建支付策略管理类。
import java.util.HashMap; import java.util.Map; public class PayStrategy { public static final String ALI_PAY = "AliPay"; public static final String JD_PAY = "JdPay"; public static final String WECHAT_PAY = "WeChatPay"; public static final String UNION_PAY = "UnionPay"; public static final String DEFAULT_PAY = ALI_PAY; private static Map<String, Payment> strategy = new HashMap<String, Payment>(); static { strategy.put(ALI_PAY, new AliPay()); strategy.put(JD_PAY, new JDPay()); strategy.put(WECHAT_PAY, new WeChatPay()); strategy.put(UNION_PAY, new UnionPay()); } public static Payment get(String payKey) { if (!strategy.containsKey(payKey)) { return strategy.get(DEFAULT_PAY); } return strategy.get(payKey); } }创建订单 Order 类。
public class Order { private String uid; private String orderId; private double amount; public Order(String uid, String orderId, double amount) { this.uid = uid; this.orderId = orderId; this.amount = amount; } public MsgResult pay() { return pay(PayStrategy.DEFAULT_PAY); } public MsgResult pay(String payKey) { Payment payment = PayStrategy.get(payKey); System.out.println("欢迎使用" + payment.getName()); System.out.println("本次交易金额为" + amount + ",开始扣款"); return payment.pay(uid, amount); } }最后编写客户端测试代码。
public class Test { public static void main(String[] args) { Order order = new Order("1", "2323235655956", 325); System.out.println(order.pay(PayStrategy.ALI_PAY)); } }运行结果如下所示。
欢迎使用支付宝 本次交易金额为325.0,开始扣款 MsgResult{code=200, data=支付金额325.0, msg='支付成功'}通过《策略模式实现选择促销优惠方案》和《策略模式实现选择支付方式场景》等常见的业务场景举例,希望小伙伴们能够更深刻地理解策略模式。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算