1、业务现状
所处的公司环境我就不多说了,在上一篇博文中已经说了一下。公司整个业务体系中包含有支付模块,支付的业务分类如下:
a)发布各类房源
b)购买各类会员(虽然没用户,但是功能存在)
c)购买各种服务
d)购买理财
大概就这几类了,支付这块的调整主要是在web页面显示的文字上的调整,真正的支付逻辑,几乎是不动的,那优化什么呢?这个主要还是技术层面从软件的灵活性和扩展性考虑进行优化的。其实各个公司的支付业务应该都是差不多的,至少是支付这块的逻辑!整个流程都大差不差的。
2、当前实现
整个支付流程的流程是调用支付接口,与余额或者第三方支付平台交互,成功后回调完成对应的支付操作。流程图如下:
现有操作的伪代码如下:
package cn.simple.old; import cn.simple.old.domain.PayModel; /** * 现状的支付模块的实现伪代码 * * @author ldm * @Date 2016年6月22日 */ public class OldPay { public PayModel pay(PayModel model) { switch (model.getPayType()) { case 1: // 余额支付 model.setPaySuccess(payThird()); break; case 2: // 支付宝支付 model.setPaySuccess(payThird()); break; case 3: // 微信支付 model.setPaySuccess(payThird()); break; case 4: // 网银 model.setPaySuccess(payThird()); break; default: model.setPaySuccess(false); break; } if (model.isPaySuccess()) { return callback(model); } else { return model; } } public PayModel callback(PayModel model) { switch (model.getType()) { case 1: // 买会员 model.setOprSuccess(callBackOpr()); break; case 2: // 买服务 model.setOprSuccess(callBackOpr()); break; case 3: // 发房 model.setOprSuccess(callBackOpr()); break; case 4: // 理财 model.setOprSuccess(callBackOpr()); break; default: model.setOprSuccess(false); break; } return model; } //////////////////////////// 这是模拟第三方支付的(不同的支付方会有不同的实现)///////////////////////////// private boolean payThird() { // 支付的参数配置。。。 return true; } /////////////////////////////// 回调具体操作/////////////////////////////////// public boolean callBackOpr() { return true; } }
从伪代码中看出,这种实现方式,是没大问题的,但是扩展性和灵活性很低。每当增加一个新业务,就必须得更改支付流程的核心类(在switch中增加新的选项),随着业务的增加迭代,又没有明确的下线,和代码优化,导致整个支付类代码非常臃肿,可读性很差。
3、优化实现
基于现有的支付流程,从扩展性和灵活性的角度出发,对这个现有的业务进行重构和优化。类图如下:
示例关键代码
命令抽象类:
package cn.simple.command.impl; import cn.simple.command.ICommand; import cn.simple.pay.IPay; /** * 命令抽象类 * * @author ldm * @Date 2016年6月22日 */ public abstract class AbstractPayCommand implements ICommand { protected IPay pay; public AbstractPayCommand(IPay pay) { this.pay = pay; } public abstract void setPay(IPay pay); /** * 执行命令 * * @author ldm * @return * @Date 2016年6月22日 */ public String doCommand() { System.out.println("执行命令"); String payResult = pay.doPay(); if (payResult.startsWith("1,")) { boolean cb = cmdCallback(); if (cb) { payResult += "^1"; } else { payResult += "^0"; } return payResult; } else { return "^0"; } } /** * 命令回调 * * @author ldm * @return * @Date 2016年6月22日 */ public abstract boolean cmdCallback(); }
调用者的实现:
package cn.simple.invoker; import cn.simple.command.impl.AbstractPayCommand; import cn.simple.command.impl.ServiceCommand; import cn.simple.pay.impl.Alipay; /** * 购买服务调用 * @author ldm * @Date 2016年6月22日 */ public class ServiceInvoker { public static void main(String[] args) { /** * 支付方式让用户确定 */ AbstractPayCommand cmd = new ServiceCommand(new Alipay()); String result = cmd.doCommand(); System.out.println("命令执行结果:"+result); if (result.startsWith("1,")) { System.out.println("支付成功"); if (result.endsWith("^0")) { System.out.println("操作失败"); } else { System.out.println("操作成功"); } } else { System.out.println("支付失败"); } } }
对业务代码进行优化后,扩展性和灵活性大大增加。
a)如果需要增加支付方式,只需要实现特定的接口;
b)增加新的需要付费服务,也是实现一下抽象命令
4、模型优化
对当前这么模型在实际生产中可以直接用,也可以进行一些优化后再使用。可以对命令和支付方式进行工厂封装。可以进一步提高灵活性。
完整示例:https://github.com/monkeyming/command
命令模式的介绍可以参考一下:http://www.cnblogs.com/hpuCode/p/5455254.html
时间: 2024-12-28 23:45:43