标签:
公司整个业务体系中包含有支付模块,支付的业务分类如下:
a)发布各类房源
b)购买各类会员(虽然没用户,但是功能存在)
c)购买各种服务
d)购买理财
大概就这几类了,支付这块的调整主要是在web页面显示的文字上的调整,真正的支付逻辑,几乎是不动的,那优化什么呢?这个主要还是技术层面从软件的灵活性和扩展性考虑进行优化的。其实各个公司的支付业务应该都是差不多的,至少是支付这块的逻辑!整个流程都大差不差的。
整个支付流程的流程是调用支付接口,与余额或者第三方支付平台交互,成功后回调完成对应的支付操作。流程图如下:
现有操作的伪代码如下:
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中增加新的选项),随着业务的增加迭代,又没有明确的下线,和代码优化,导致整个支付类代码非常臃肿,可读性很差。
基于现有的支付流程,从扩展性和灵活性的角度出发,对这个现有的业务进行重构和优化。类图如下:
示例关键代码
命令抽象类:
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)增加新的需要付费服务,也是实现一下抽象命令
对当前这么模型在实际生产中可以直接用,也可以进行一些优化后再使用。可以对命令和支付方式进行工厂封装。可以进一步提高灵活性。
本文为摘抄
标签:
原文地址:http://www.cnblogs.com/UC0079/p/5609249.html