状态模式+状态机模拟实现钉钉审批流程笔记

简单需求流程图:

 

直接上代码

import com.google.common.collect.HashBasedTable;
import lombok.Data;
import lombok.Getter;

import java.util.Arrays;
import java.util.List;

/**
 * 模拟钉钉审核流程,状态机实现
 *
 * @author test
 * @create 2023-04-08 下午9:25
 */
@Getter
public enum Event {
    SUBMIT,
    PASS,
    REJECT
}

@Getter
enum State {
    REJECT,
    FINISH,
    LEADER_CHECK,
    HR_CHECK,
    UN_SUBMIT
}

/**
 * 简易版
 */
class StateMachine {
    /**
     * 用两个key确定一个内容
     */
    private static final HashBasedTable<State, Event, State> hashBasedTable = HashBasedTable.create();

    static {
        hashBasedTable.put(State.UN_SUBMIT, Event.SUBMIT, State.LEADER_CHECK);
        hashBasedTable.put(State.LEADER_CHECK, Event.PASS, State.HR_CHECK);
        hashBasedTable.put(State.LEADER_CHECK, Event.REJECT, State.REJECT);
        hashBasedTable.put(State.HR_CHECK, Event.PASS, State.FINISH);
        hashBasedTable.put(State.HR_CHECK, Event.REJECT, State.REJECT);
    }

    public static State getNext(State state, Event event) {
        State next = hashBasedTable.get(state, event);
        if (next == null) {
            throw new RuntimeException("错误状态");
        }
        return next;
    }
}

/**
 * 简易版测试
 */
class MachineTest {
    public static void main(String[] args) {
        State next = StateMachine.getNext(State.LEADER_CHECK, Event.PASS);
        System.out.println(next);
    }
}

/**
 * 过程
 */
@Data
class SopProcess {
    private State from;
    private State to;
    private Event event;
    private IStateHandler handler;
}

/**
 * 过程建造者
 */
class SopProcessBuilder {

    private SopProcess sopProcess;

    private void setSopProcess(SopProcess sopProcess) {
        this.sopProcess = sopProcess;
    }

    public static SopProcessBuilder getInstance() {
        SopProcessBuilder sopProcessBuilder = new SopProcessBuilder();
        sopProcessBuilder.setSopProcess(new SopProcess());
        return sopProcessBuilder;
    }

    public SopProcessBuilder from(State state) {
        sopProcess.setFrom(state);
        return this;
    }

    public SopProcessBuilder to(State state) {
        sopProcess.setTo(state);
        return this;
    }

    public SopProcessBuilder event(Event event) {
        sopProcess.setEvent(event);
        return this;
    }

    public SopProcessBuilder handler(IStateHandler handler) {
        sopProcess.setHandler(handler);
        return this;
    }

    public SopProcess build() {
        return sopProcess;
    }
}

/**
 * 抽象状态机
 */
abstract class AbstractStateMachine {

    /**
     * 执行类
     */
    @Data
    static class SopExec {
        private State nextState;
        private IStateHandler stateHandler;
    }

    private HashBasedTable<State, Event, SopExec> hashBasedTable = HashBasedTable.create();

    /**
     * 数据初始化
     */ {
        List<SopProcess> sopProcesses = init();
        sopProcesses.forEach(item -> {
            SopExec sopExec = new SopExec();
            sopExec.setNextState(item.getTo());
            sopExec.setStateHandler(item.getHandler());
            hashBasedTable.put(item.getFrom(), item.getEvent(), sopExec);
        });
    }

    abstract List<SopProcess> init();

    /**
     * 获取下一个状态
     *
     * @param from  初始状态
     * @param event 事件
     * @return 下一个状态
     */
    public State getNext(State from, Event event) {
        SopExec sopExec = hashBasedTable.get(from, event);
        if (sopExec == null) {
            throw new RuntimeException("状态错误");
        }
        return sopExec.getNextState();
    }

    /**
     * 获取下一个处理器
     *
     * @param from  初始状态
     * @param event 事件
     * @return 下一个处理器
     */
    public IStateHandler getHandle(State from, Event event) {
        SopExec sopExec = hashBasedTable.get(from, event);
        if (sopExec == null) {
            throw new RuntimeException("状态错误");
        }
        return sopExec.getStateHandler();
    }
}

/**
 * 新状态机/复杂状态机
 */
class NewStateMachine extends AbstractStateMachine {

    /**
     * 初始化数据
     *
     * @return 初始化数据
     */
    @Override
    List<SopProcess> init() {
        return Arrays.asList(
                SopProcessBuilder.getInstance()
                        .from(State.UN_SUBMIT)
                        .event(Event.SUBMIT)
                        .to(State.LEADER_CHECK)
                        .handler(new SubmitHandler())
                        .build(),
                SopProcessBuilder.getInstance()
                        .from(State.LEADER_CHECK)
                        .event(Event.PASS)
                        .to(State.HR_CHECK)
                        .handler(new LeaderPassHandler())
                        .build(),
                SopProcessBuilder.getInstance()
                        .from(State.LEADER_CHECK)
                        .event(Event.REJECT)
                        .to(State.REJECT)
                        .handler(new LeaderRejectHandler())
                        .build(),
                SopProcessBuilder.getInstance()
                        .from(State.HR_CHECK)
                        .event(Event.PASS)
                        .to(State.FINISH)
                        .handler(new HrPassHandler())
                        .build(),
                SopProcessBuilder.getInstance()
                        .from(State.HR_CHECK)
                        .event(Event.REJECT)
                        .handler(new HrRejectHandler())
                        .to(State.REJECT)
                        .build()
        );
    }
}

/**
 * 处理器接口
 */
interface IStateHandler {

    String handle();
}

/**
 * 提交处理器
 */
class SubmitHandler implements IStateHandler {
    @Override
    public String handle() {
        System.out.println("流程提交,开始审批......");
        return "已提交,转为领导审批";
    }
}

/**
 * Leader审核通过处理器
 */
class LeaderPassHandler implements IStateHandler {
    @Override
    public String handle() {
        System.out.println("领导开始审批......");
        return "领导审批通过,转为HR审批";
    }
}

/**
 * Leader审核拒绝处理器
 */
class LeaderRejectHandler implements IStateHandler {
    @Override
    public String handle() {
        System.out.println("领导开始审批......");
        return "领导审批拒绝,结果:拒绝";
    }
}

/**
 * HR审核通过处理器
 */
class HrPassHandler implements IStateHandler {
    @Override
    public String handle() {
        System.out.println("Hr开始审批......");
        return "Hr审批通过,结果:完成";
    }
}

/**
 * HR审核拒绝处理器
 */
class HrRejectHandler implements IStateHandler {
    @Override
    public String handle() {
        System.out.println("Hr开始审批......");
        return "Hr审批拒绝,结果:拒绝";
    }
}

/**
 * 新状态机测试
 */
class NewMachineTest {
    public static void main(String[] args) {
        State from = State.HR_CHECK;
        Event event = Event.PASS;
        
        System.out.println("当前状态:" + from);
        System.out.println("当前动作:" + event);

        NewStateMachine newStateMachine = new NewStateMachine();
        State nextState = newStateMachine.getNext(from, event);
        System.out.println("下一个状态:" + nextState);

        IStateHandler stateHandler = newStateMachine.getHandle(from, event);
        System.out.print("处理过程:");
        String handleResult = stateHandler.handle();
        System.out.println("处理结果:" + handleResult);
    }
}

执行结果:

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 状态机模式审批流程中的应用,可以提高审批流程的灵活性和可扩展性。状态机模式是一种面向对象设计模式,它将对象的行为和状态进行了分离,将对象的状态转移和对应的行为封装在状态对象中。 在审批流程中,可以使用状态机模式来定义不同的审批状态和可执行的行为。首先,需要定义一个抽象的状态类,其中包含了审批状态所需要完成的操作方法。然后,可以派生出具体的状态类,实现各自的操作方法。 在审批流程中,每个审批实例都有一个初始状态,可以通过状态转移来改变审批实例的状态状态转移可以通过定义不同状态之间的关系来实现。例如,一个审批实例的状态可以从待审批状态转移到已通过状态、已拒绝状态或者重新发起状态。当状态发生转移时,相应的操作方法会被调用,执行对应的行为。 使用状态机模式可以将复杂的审批流程进行模块化和封装,每个状态只需要关注自己的行为,不需要关注其他状态的行为。这样可以增加代码的可读性和维护性,同时也可以方便地修改或者扩展审批流程。可以通过新增状态类或者修改状态之间的关系来实现流程的调整。 总之,Java 状态机模式审批流程中的应用可以提高审批流程的灵活性和可扩展性。它将对象的行为和状态分离,使得状态转移和对应的行为更加清晰可控。通过定义不同状态之间的关系和对应的操作方法,可以实现审批流程的灵活调整和功能扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值