关于混合支付的模型

来源:互联网 发布:上证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
原创粉丝点击