关于混合支付的模型
来源:互联网 发布:上证50指数每日数据 编辑:程序博客网 时间:2024/05/02 23:07
一般业务涉及到支付的产品基本都会实现一个混合支付的功能,最简单的混合支付包含了:虚拟货币+优惠券+余额+现金,复杂的还会有代付、信用欠款等。
往往现实业务会需要比较复杂的支付方式,比如常见的实物商品不允许虚拟货币,优惠券额度剩余部分不退,多种优惠券只能使用一种,或者一次只能使用一张,某些商品不能使用优惠等等多种多样的变形。
基本混合支付都必须解决的问题是1:确定各种支付方式的优先级,2:某种支付方式不同选择直接互斥,3:剩余部分是否返回账户
public class MixPay {static private MixPay instance;static public MixPay getInstance() {if(instance == null) {instance = new MixPay();}return instance;}static public final int DOU = 0;static public final int QUAN = 1;static public final int REST = 2;static public final int MONEY = 3;static private Map<Integer, CalcType> map = new HashMap<Integer, CalcType>();static public class Cost {public int type;public double cost;public Cost(int type, double cost) {this.type = type;this.cost = cost;}}static private interface CalcType {public double calc(double money);}static private class NoChange implements CalcType {private double value;public NoChange(double value) {this.value = value;}@Overridepublic double calc(double money) {return value;}}static private class KeepChange implements CalcType {private double value;public KeepChange(double value) {this.value = value;}@Overridepublic double calc(double money) {if(value >= money) {return money;} else {return value;}}}public List<Cost> cost(double total) {ArrayList<Cost> ret = new ArrayList<Cost>();for(int i = 0; i < MONEY; ++i) {CalcType c = map.get(i);if(c != null) {double cost = c.calc(total);total = total - cost;ret.add(new Cost(i, cost));if(total <= 0) {break;}}}ret.add(new Cost(MONEY, total));return ret;}public void set(int key, double value) {if(key == DOU) {map.clear();map.put(key, new KeepChange(value));} else if(key == QUAN) {map.put(key, new NoChange(value));} else {map.put(key, new KeepChange(value));}}public void remove(int key) {map.remove(key);}}
为了一致性,最后计算出的现金也会以和其它支付方式相同的格式返回,如果业务需求更宽松,可以把中间关于是否保留剩余部分业务抛除,这样模型更通用更灵活,但是留给上层的业务处理也会更多。
加入混合支付这一层后,就将业务隔离的更清晰,业务和支付分离,业务的关注点将更简单,容易适应频繁的业务变化。
0 0
- 关于混合支付的模型
- 关于高斯混合模型的心得
- 关于高斯混合模型的心得
- 关于高斯混合模型的心得
- 关于高斯混合模型的心得 .
- 关于Dirichlet过程混合模型(DPMM)的理解
- 关于opengl的混合
- 关于支付宝龙卡的
- 关于Googleplay的支付
- 关于支付宝支付界面的实现
- 关于支付宝支付的问题
- php关于支付宝支付的探讨
- 关于支付宝支付出现的问题
- 关于支付宝的支付流程
- 关于OpenGL混合的基本知识
- 关于OpenGL混合的基本知识
- OpenCv的混合高斯模型
- 高斯混合模型的Matlab实例
- 在博客,帖子,日志中插入公式的方法
- 深入理解LINUX内核学习笔记01
- Git 基本配置
- ios代码ui1112
- 蓝桥杯备战-字母图形
- 关于混合支付的模型
- 在CentOS安装CMake
- BZOJ 3172 Tjoi2013 单词 后缀数组
- Java远程通讯可选技术及原理
- leetcode c++ set matrix zeroes
- vxworks中c语言获取系统名及获取IP地址例子
- linux grep命令(查找文件里符合条件的字符串)
- 程序员必须知道的10大基础实用算法及其讲解
- 美锦家居彩妆膜洋葱