状态模式
状态模式:就是状态会根据流程来变化,例如工作中常见的工作流(请假申请)等;
Context:这里面存放了整个流程状态的属性,还有一个流程启动方法;
State:定义一个流程执行方法,并依赖Context,每个流程节点都必须实现该接口,这样当流程到这个节点时,就能拿到当前的流程状态(Context);
/**
* 流程控制
*
*/
public class FlowContext {
private boolean flag; // 代表流程是否结束
/**
* 流程状态 0:通过 1:驳回 2.退回整改 3.已申请
*
*/
private int status;
private String message; // 消息
private Node node; // 节点信息
public static boolean start(FlowContext context) {
Node node = new LeadNode();
context.setNode(node); // 设置初始节点
context.setStatus(3); // 设置状态为申请中
context.getNode().nodeHandle(context); // **发起请求,从这里开始流程**
// 最后要知道是否申请成功
//判断当前是最后一个节点并且审核通过,而且流程结束
if("HR李".equals(node.getName())&&0==context.getStatus()&&context.isFlag()){
System.out.println("审核通过,流程结束");
return true;
}else{
System.out.println("审核未通过,流程已经结束");
return false;
}
}
public FlowContext() {
super();
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Node getNode() {
return node;
}
public void setNode(Node node) {
this.node = node;
}
}
/**
* 节点接口 就是类图中的State
*
*/
public abstract class Node {
private static String name; //当前节点名称
//节点跳转
public abstract void nodeHandle(FlowContext context);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 领导节点
*
* @author gh
*
*/
public class LeadNode extends Node {
@Override
public void nodeHandle(FlowContext context) {
//根据当前流程的状态,来控制流程的走向
//先判断流程是否结束
if(!context.isFlag()){
System.out.println(context.getMessage()); //先读取申请的内容
if(context!=null&&3==context.getStatus()){ //只有出于已经申请的状态才又部门领导审核
//设置当前节点的名称
setName("张经理");
//加上审核意见
context.setMessage(context.getMessage()+getName()+"审核通过;");
//审核通过
context.setStatus(0); //审核通过并指向下一个节点
context.setNode(new HrNode());
context.getNode().nodeHandle(context);
}
}else{
System.err.println("流程已经结束");
}
}
}
public class HrNode extends Node {
@Override
public void nodeHandle(FlowContext context) {
//先判断流程是否结束
if(!context.isFlag()){
// 根据当前流程的状态,来控制流程的走向
if (context != null &&
0 == context.getStatus()) { //只有上一级审核通过后才能轮到HR审核
// 设置当前节点的名称
setName("HR李");
//读取上一级的审核内容并加上自己的意见
System.out.println(context.getMessage()+getName()+"审核通过");
// 审核通过
context.setStatus(0); //HR审核通过并指向下一个节点 ,如果没有下一个节点就把状态设置为终结
context.setFlag(true);
}
}else{
System.out.println("流程已经结束");
}
}
}
public class Test {
public static void main(String[] args) {
FlowContext context=new FlowContext();
context.setMessage("请假内容");
context.start(context);
}
}