状态模式:【审核状态的流转】

582 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

状态模式用于审核等状态的流转,在开发涉及流程时用到的很多。如从待审核到审核通过,或者待审核到驳回,驳回后又想通过等场景,使用if判断会增加维护的复杂性,因此可以使用状态模式来进行统一维护。

代码实现

代码结构

├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─example
│  │  │          └─design
│  │  │              └─state
│  │  │                  │  CheckResult.java
│  │  │                  │  StateConfig.java
│  │  │                  │  StateHandler.java
│  │  │                  │  StatusState.java
│  │  │                  │
│  │  │                  ├─enums
│  │  │                  │      Status.java
│  │  │                  │
│  │  │                  └─impl
│  │  │                        RefusedState.java
│  │  │                        VerifiedState.java
│  │  │                        WaitingVerifyState.java

需要使用状态模式的枚举状态

package com.example.design.state.enums;

public enum Status {
    // 待审核
    WAITING_VERIFY,
    // 审核通过
    VERIFIED,
    // 拒绝
    REFUSED;
}

定义枚举状态接口,每个状态定义一个方法

package com.example.design.state;

import com.example.design.state.enums.Status;

public interface StatusState {

    CheckResult waitingVerify(String id, Status currentStatus);

    CheckResult verified(String id, Status currentStatus);

    CheckResult refused(String id, Status currentStatus);
}

定义配置,用来存放枚举实现类的map

package com.example.design.state;

import com.example.design.state.enums.Status;
import com.example.design.state.impl.RefusedState;
import com.example.design.state.impl.VerifiedState;
import com.example.design.state.impl.WaitingVerifyState;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class StateConfig {

    protected static Map<Status, StatusState> statusStatusStateMap = new ConcurrentHashMap<>();

    static {
        statusStatusStateMap.put(Status.WAITING_VERIFY, new WaitingVerifyState());
        statusStatusStateMap.put(Status.REFUSED, new RefusedState());
        statusStatusStateMap.put(Status.VERIFIED, new VerifiedState());
    }
}

校验的结果,通过结果判断是否能转换状态

package com.example.design.state;

import lombok.Data;

/**
 * 检验结果
 */
@Data
public class CheckResult {

    private String message;

    private boolean successful;

    public static CheckResult succeed(String message) {
        CheckResult checkResult = new CheckResult();
        checkResult.setSuccessful(true);
        checkResult.setMessage(message);
        return checkResult;
    }

    public static CheckResult failed(String message) {
        CheckResult checkResult = new CheckResult();
        checkResult.setSuccessful(false);
        checkResult.setMessage(message);
        return checkResult;
    }
}

stateHandler,枚举状态处理器

package com.example.design.state;

import com.example.design.state.enums.Status;

public class StateHandler extends StateConfig implements StatusState {

    @Override
    public CheckResult waitingVerify(String id, Status currentStatus) {
        return statusStatusStateMap.get(currentStatus).waitingVerify(id, currentStatus);
    }

    @Override
    public CheckResult verified(String id, Status currentStatus) {
        return statusStatusStateMap.get(currentStatus).verified(id, currentStatus);
    }

    @Override
    public CheckResult refused(String id, Status currentStatus) {
        return statusStatusStateMap.get(currentStatus).refused(id, currentStatus);
    }
}

“待审核”状态的状态处理

package com.example.design.state.impl;

import com.example.design.state.CheckResult;
import com.example.design.state.StatusState;
import com.example.design.state.enums.Status;

public class WaitingVerifyState implements StatusState {
    @Override
    public CheckResult waitingVerify(String id, Status currentStatus) {
        return CheckResult.failed("已经是待审核状态了!");
    }

    @Override
    public CheckResult verified(String id, Status currentStatus) {
        return CheckResult.succeed("审核通过!");
    }

    @Override
    public CheckResult refused(String id, Status currentStatus) {
        return CheckResult.succeed("已驳回!");
    }
}

“审核通过”状态的状态处理

package com.example.design.state.impl;

import com.example.design.state.CheckResult;
import com.example.design.state.StatusState;
import com.example.design.state.enums.Status;

public class VerifiedState implements StatusState {
    @Override
    public CheckResult waitingVerify(String id, Status currentStatus) {
        return CheckResult.failed("已审核通过!");
    }

    @Override
    public CheckResult verified(String id, Status currentStatus) {
        return CheckResult.failed("审核已通过, 不能重复审核!");
    }

    @Override
    public CheckResult refused(String id, Status currentStatus) {
        return CheckResult.failed("审核通过, 不能驳回!");
    }

}

“已驳回”状态的状态处理

package com.example.design.state.impl;

import com.example.design.state.CheckResult;
import com.example.design.state.StatusState;
import com.example.design.state.enums.Status;

public class RefusedState implements StatusState {
    @Override
    public CheckResult waitingVerify(String id, Status currentStatus) {
        return CheckResult.failed("审核已被拒绝, 不能切换审核状态!");
    }

    @Override
    public CheckResult verified(String id, Status currentStatus) {
        return CheckResult.failed("审核已被拒绝, 不能切换审核状态!");
    }

    @Override
    public CheckResult refused(String id, Status currentStatus) {
        return CheckResult.failed("审核已被拒绝, 不能切换审核状态!");
    }

    @Override
    public CheckResult canceled(String id, Status currentStatus) {
        return null;
    }
}