今天查找线上问题,看到一个让我脑洞大开的工作流实现方式。以前用过责任链模式,也用过模板模式实现类工作流的方式,但是对比这个工具,逊色不少,不卖关子了,就是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);}
}

以上就是本文的全部内容,希望对大家的学习有所帮助
为了学习工作与休闲娱乐互不冲突,现新建圈【码农茶水铺】用于程序员生活,爱好,交友,求职招聘,吐槽等话题交流,希望各位大神工作之余到茶水铺来喝茶聊天。群号:603619042
还有大量的面试题,视频资源共享,

浅谈JAVA工作流的优雅实现方式相关推荐

  1. java 对象之间转换_浅谈java对象之间相互转化的多种方式

    浅谈java对象之间相互转化的多种方式,对象,属性,参数,赋值,不支持 浅谈java对象之间相互转化的多种方式 易采站长站,站长之家为您整理了浅谈java对象之间相互转化的多种方式的相关内容. 第一种 ...

  2. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  3. java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...

    浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...

  4. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  5. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  6. java的throw_浅谈Java的throw与throws

    浅谈Java异常 以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区别还是有不太清楚.今天用实例测试一下 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被 ...

  7. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  8. java手动回收_浅谈java是如何做资源回收补救的

    学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...

  9. file相对路径java_浅谈java 中文件的读取File、以及相对路径的问题

    一.对于java项目中文件的读取 1.使用system 或是 系统的properties对象 ①直接是使用 string relativelypath=system.getproperty(" ...

  10. java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法

    在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

最新文章

  1. JavaScript那些事儿-不被知晓的预解释
  2. Zookeeper 服务注册中心
  3. 视频 + PPT 下载 | 在线教育行业如何制定用户分层运营策略?
  4. 你了解HTTPS工作原理吗?
  5. latex正文显示运算符
  6. 有关JAVA中不同方法对String连接性能的总结
  7. python 正则表达式 re.sub_Python 正则表达式 re.match/re.search/re.sub的使用解析
  8. 产品运营必备的素质有哪些
  9. 【To Understand】程序员面试金典——番外篇之洪水
  10. 网络性能测试工具iperf的安装与使用
  11. 小花语音机器人(零)-单片机控制驱动板PCB
  12. OPPO a1刷机包下载_OPPOA1密码忘记了?来这里搞定
  13. 夕夕博士的视频观后笔记集合~
  14. iOS 隐藏百度地图SDK的百度LOGO
  15. (已解决)spring-boot maven报错Project 'org.springframework.boot:spring-boot-starter-parent:2.2.0.RELEAS
  16. python定义一个字符串变量_python基础入门语法和变量类型(一)
  17. linux -m32,32位gcc和64位gcc与-m32选项有什么区别?
  18. mysql error :1114 - The table ‘XXX‘ is full
  19. 视频-视频基础(H264)
  20. 程序员:不是所有的程序员称为程序员!

热门文章

  1. 误差函数erf matlab,matlab求解erf误差函数方法(有详细注释 )
  2. matlab 坐标轴根号,在matlab图例中如何打数学符号---根号?
  3. visio如何粘附或取消粘附连接线
  4. steamcommunity302怎么用【使用方法】
  5. 力扣(leetcode) 69. x 的平方根 (四种方法解决,总有一种是你会的~)
  6. CWRU滚动轴承数据集简介
  7. Findbugs错误总结
  8. linux系统开启ntp服务器配置,Linux系统 NTP服务器配置详解
  9. K均值聚类算法以及模糊K均值算法研究,matlab
  10. 内网远程工具vnc 内网远程工具vnc选择与安装