//通用的Contex
public class StateMachine {
//持有的状态对象
private State state;
//处理状态过程中需要的业务数据
private Object businessVO;
public void process(){
state.process(this);
}
...省略state和businessVO的getter和setter方法
}
//请假流程中使用的Context
public class LeaveRequestContext extends StateMachine {
}
State:同样引入了更上一层的接口
//通用的State
public interface State{
void process(StateMachine context);
}
//请假流程中使用的State
public interface LeaveRequestState extends State {
}
ConcreteState:有三个
//项目经理状态
public class ProjectManagerState implements LeaveRequestState {
@Override
public void process(StateMachine request) {
LeaveRequestModel model = (LeaveRequestModel) request.getBusinessVO();
//模拟审批过程
mockAudit(model);
if("同意".equals(model.getResult())){
if(model.getLeaveDays() < 3){
request.setState(new AuditOverState());
}else {
request.setState(new DepManagerState());
}
}else {
request.setState(new AuditOverState());
}
}
private void mockAudit(LeaveRequestModel model) {
boolean res = new Random().nextBoolean();
if(res){
model.setResult("同意");
}else {
model.setResult("不同意");
}
}
}
//部门经理状态
public class DepManagerState implements LeaveRequestState {
@Override
public void process(StateMachine request) {
LeaveRequestModel model = (LeaveRequestModel) request.getBusinessVO();
//模拟审批过程
mockAudit(model);
//将流程状态设置为结束
request.setState(new AuditOverState());
}
private void mockAudit(LeaveRequestModel model) {
boolean res = new Random().nextBoolean();
if(res){
model.setResult("同意");
}else {
model.setResult("不同意");
}
}
}
//审批结束状态
public class AuditOverState implements LeaveRequestState {
@Override
public void process(StateMachine stateMachine) {
LeaveRequestModel model = (LeaveRequestModel)stateMachine.getBusinessVO();
System.out.println("请假审批结束,审批结果:" + model.getResult());
}
}
业务数据
public class LeaveRequestModel {
//请假人
private String user;
//请假开始时间
private String beginDate;
//请假天数
private int leaveDays;
//请假结果
private String result;
....省略以上属性的getter和setter方法
}
客户端:就是构建一个状态机,然后让状态机开始工作
StateMachine context = new LeaveRequestContext();
context.setBusinessVO(model);
context.setState(new ProjectManagerState());
context.process();