22.状态模式

状态模式

状态模式:就是状态会根据流程来变化,例如工作中常见的工作流(请假申请)等;

在这里插入图片描述
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);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT界的老菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值