为了加深对策略模式的理解,本节在来学习一个实例。相信小伙伴们都用过支付宝、微信支付、银联支付及京东白条,常见的应用场景就是大家在下单支付时会提示选择支付方式,如果没有选择支付方式,系统会用默认推荐的支付方式进行结算。

下面我们使用策略模式来模拟此业务场景,类图如下。

首先创建 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 strategy = new HashMap();

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语言支付方式,使用策略模式实现支付方式选择场景相关推荐

  1. 策略模式总结,适用场景,优缺点,代码示例

    策略模式总结,适用场景,优缺点,代码示例 1.简介 1.1 继承带来的扩展和复用问题 1.2 进一步改进,利用接口 1.3 进一步改进,策略模式 2.适用场景 3.优点 4.缺点 5.代码示例 6.源 ...

  2. 设计模式Java语言实现之策略模式

    策略模式: 前言: 作者:韩数 Github:github.com/hanshuaikan- 时间:2019-01-26 JDK版本:1.8 定义: 定义一系列的算法,把它们一个个封装起来,并且使它们 ...

  3. C语言实现设计模式-策略模式+命令模式组合使用

    文章目录 使用环境介绍 使用策略模式-区分使用哪种方法 使用命令模式-区分哪种命令动作 使用环境介绍 当主设备和从设备使用串口信息交互通讯,根据串口协议,实现对从设备的控制访问. 使用情况1:当主设备 ...

  4. C语言和设计模式-策略模式

    策略模式 1.赔了夫人又折兵 "孙权看到刘备有雄起之意,杀是不能杀了,那会惹天下人唾弃,就想个招挫他一下,那有什么办法呢?孙权有个妹妹--孙尚香,准备招刘备做女婿,然后孙权想办法把刘备软禁起 ...

  5. C语言实现设计模式—策略模式

    文章目录 策略模式介绍 实现分析 代码模块 Step1:支持处理的数据类型,按优先级顺序划分,即区分策略类型 Step2: 查找策略对象,方法处理 Step3: 设备处理 策略模式介绍 意图:定义一系 ...

  6. 策略模式Strategy Pattern应用场景

    策略模式(Strategy Pattern)是指定义了算法家族.分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户. 策略模式的应用场景 1.假如系统中有很多类,而他们的 ...

  7. C语言,去你的策略模式!

    前言 这里先插一点题外话,在C语言中,实现封装.继承.隐藏.多态等等特性,是完全没有问题的.但是在使用过程中,必定是不如自带这些特性的语言方便好用的,比如C \java等. 一旦要通过C语言来实现各种 ...

  8. Java设计模式-策略模式(Strategy)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...

  9. 采用注解实现策略模式

    目录 一.前言 二.采用简单的注解方式进行业务策略模式 (一)场景举例 (二)实现方案 1.基本代码准备 2.基本功能接口定义 3.定义注解与不同的策略实现 4.业务实际使用 5.测试及结果展示 三. ...

最新文章

  1. Winform开发中常见界面的DevExpress处理操作
  2. Android 系统镜像: boot.img kernel.img ramdisk.img system.img userdata.img cache.img recovery.img
  3. HDU 1254 推箱子 BFS
  4. reactjs redux异步action
  5. opencv4.10不能使用sift = cv2.xfeatures2d.SIFT_create()
  6. linux 下 oracle 10.2.0.1 32bit netca报错
  7. 12个很棒的Spring数据教程来启动您的数据项目
  8. k8s + 微服务,王炸!
  9. js中几个对象的区别和用法
  10. 实战Flash游戏开发
  11. 美团三面挂了....这个坑千万别踩!
  12. Android 手机模拟游戏手柄(USB,C#,winio)
  13. bms中soh计算方式_BMS算法设计之电池SOH介绍(上)
  14. Easypack: Ansible方式部署工具中升级Dashboard至2.0.0版
  15. 5、多线程:龟兔赛跑
  16. EnumSet源码分析
  17. SEO基础知识:什么是网站结构,为什么重要?
  18. CXF框架发布WebService服务的例子
  19. 软件测试-3(测试场景)
  20. 关于小蚂蚁数据(SmallAnt Data)

热门文章

  1. element ui表单验证,验证通过但是不进if(valid){}步骤
  2. Mars3d从菜鸟到大神的超级捷径
  3. Gemfire命令集
  4. c语言单链表的创建展示
  5. 超级搞笑,肚子疼的别进来了[分享]
  6. Java并发编程一线程池的五种状态
  7. Linux之常用的压缩解压缩命令
  8. linux解压文件命令
  9. CSS属性之颜色与字体
  10. linux查看计算机系统软件,如何查询电脑系统版本 怎么查看电脑版本是系统几