java工作流
今天查找线上问题,看到一个让我脑洞大开的工作流实现方式。以前用过责任链模式,也用过模板模式实现类工作流的方式,但是对比这个工具,逊色不少,不卖关子了,就是Apache Commons Chain,它是command模式与责任链模式的综合体。
1
Apache Commons Chain 中的角色有:chain、context、command。
2
在我们订单系统有这样的业务,就是退票的时候,会根据核损后的订单价格,给客人退钱,但是订单的金额,由几部分组成
有现金、商旅卡、有优惠券。所以根据需求,我们需要一个工作流来走下退款流程,我们的流程流转的步骤是这样的:
先退商旅卡-----如果还有余额退现金-----------还有余额再退优惠券,分析一下这样的需求,刚好可以用这个工具,直接上代码了
先引入包
<dependency>
<groupId>commons-chain</groupId>
<artifactId>commons-chain</artifactId>
<version>1.2</version>
</dependency>
编写command
/**
* 退商旅卡Cash
* Created by 一代天骄 on 2018/7/1.
*/
@Slf4j
public class RefundBusinessCardCommand implements Command{
public boolean execute(Context context) throws Exception {
RefundContext refundContext = (RefundContext) context;
log.info("orderId:{} 退款开始,第一步:退商旅卡,金额:{}",refundContext.getOrderId(),"10");
return false;
}
}
/**
* 退现金
* Created by 一代天骄 on 2018/7/1.
*/
@Slf4j
public class RefundCashCommand implements Command {
public boolean execute(Context context) throws Exception {
RefundContext refundContext = (RefundContext) context;
log.info("orderId:{}退款开始,第二步:退现金,金额:{}",refundContext.getOrderId(),"5");
return false;
}
}
/**
* 退优惠券
* Created by 一代天骄 on 2018/7/1.
*/
@Slf4j
public class RefundPromotionCommand implements Command{
public boolean execute(Context context) throws Exception {
RefundContext refundContext = (RefundContext) context;
log.info("orderId:{} 退款开始,第二步:退优惠券,金额:{}",refundContext.getOrderId(),"20");
return false;
}
}
* Created by 一代天骄 on 2018/7/1.
*/
@Data
public class RefundContext extends ContextBase {
/**
* 订单号
*/
private integer orderId;
}
/**
*
* 退票的工作流实现
* Created by 一代天骄 on 2018/7/1.
*/
public class RefundticketChain extends ChainBase {
public void init() {
//退商旅卡
this.addCommand(new RefundBusinessCardCommand());
//退现金
this.addCommand(new RefundCashCommand());
//退优惠券
this.addCommand(new RefundPromotionCommand());
}
public static void main(String[] args) throws Exception {
RefundTicketChain refundTicketChain = new RefundTicketChain();
refundTicketChain.init();
RefundContext context = new RefundContext();
context.setOrderId(1621940242);
refundTicketChain.execute(context);
}
}
相关阅读
最近在看排序算法,对此做个总结。参考文章:https://www.cnblogs.com/onepixel/articles/7674659.htmlhttps://www.cnblogs.com/guoy
C#操作xml文件:使用XmlDocument 实现读取和写入
XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影。Xml是
问题描述:给出4个[0,13]的数值,经过任意加减乘除后得到24.思路: 假设四个数为a1,a2,a3,a4,其中四个符号为t1,t2,t3,t4。 我们先计算
Android实现一个简单的SQLite数据库的增删改查 SQLite是一个轻量级的嵌入式数据库引擎,它支持SQL语言,并且占用很少的内存就
一、Base64编码原理 Base64编码是基于64个字符A-Z,a-z,0-9,+,/的编码方式,因为2的6次方正好为64,所以就用6bit就可以表示出64个字符,eg: