文章目录
前言
上一篇文章 “状态机(FSM)、状态模式在金融支付系统中的应用(一)” 中粗略的讲了一下状态机和状态模式的概念,但是实际工作中代码怎么写估计很多人还云里雾里,下面会以代码的方式真正展示一下实际工作中状态模式和状态机的使用,写法有很多这里我展示一种比较容易理解和操作的。
1.将UML转化成实际的代码
还是回归状态模式的UML图:
这里我们可以分析一下关键点:
Context的是一个聚合状态的类,持有所有状态相当于一个状态管理者
State是一个抽象的状态,里面可以定义一些获取状态的方法等,子类可以进行覆盖
找到了关键点接下来我们以一个简化后的退款状态机为例子展开:
1.先定义一个Context用于维护状态本身,这里我们能看到context本身还可以增加类似于通知mq发email消息等扩充功能。
public abstract class AbstractContext {
//下个状态
public abstract void doNext(String result);
//获取当前状态
public abstract String status();
//状态顺序
public abstract Integer order();
public void notifyEmial() throws Exception {
//发送email通知
}
public void notifyMQ() throws Exception {
//通知mq
}
}
2.然后我们建一个退费的Context,他持有所有的状态,对外统一处理管理实现了高内聚
public class RefundContext extends AbstractContext{
//下面就是不同的状态
public final RefundState APPLIED = new ApplyState(this);
public final RefundState PROCESSING = new ProcessState(this);
public final RefundState SUCCESS = new SuccessState(this);
public final RefundState FAILURE = new FailState(this);
public fi