携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}
}