状态设计模式

一、状态模式概述

状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。不过,状态机的实现方式有多种,除了状态模式,比较常用的还有分支逻辑法和查表法

有限状态机,英文翻译是 Finite State Machine,缩写为 FSM,简称为状态机。状态机有 3 个组成部分:状态(State)、事件(Event)、动作(Action)。其中,事件也称为转移条件(Transition Condition)。事件触发状态的转移及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。

二、状态模式的三种实现方式

以支付收获为例。

三种状态State:未支付、未收货、完成。

两种事件Event:支付、收货。

状态的流转即动作:支付后状态为未收货,收获后状态为完成。

/**
 * 支付状态枚举
 */
@Getter
public enum PayStateEnum {
   

    /**
     * 待支付
     */
    UNPAY(0),

    /**
     * 待收货
     */
    UNRECEIVE(1),

    /**
     * 完成
     */
    FINAL(2),

    /**
     * 错误
     */
    ERROR(3);

    /**
     * 值
     */
    private int value;

    PayStateEnum(int value) {
   
        this.value = value;
    }
}

/**
 * 支付事件枚举
 */
@Getter
public enum PayEventEnum {
   

    /**
     * 支付
     */
    PAY(0),

    /**
     * 收货
     */
    RECEIVE(1);

    /**
     * 值
     */
    private int value;

    PayEventEnum(int value) {
   
        this.value = value;
    }
}

2.1 逻辑分支

使用if-else或者switch-case进行处理的方式

/**
 * 支付状态机:逻辑分支
 */
@Slf4j
public class PayStateMachine {
   

    /**
     * 当前状态
     */
    private PayStateEnum payStateEnum;

    public PayStateMachine() {
   
        payStateEnum = PayStateEnum.UNPAY;
    }

    public void executeEvent(PayEventEnum payEventEnum) {
   
        switch (payEventEnum) {
   

            //支付行为发生:未支付->待收货
            case PAY:
                if (this.payStateEnum != PayStateEnum.UNPAY) {
   
                    log.info("商铺不是【未支付】状态,请核验!");
                    this.payStateEnum = PayStateEnum.ERROR;
                    break;
                }
                this.payStateEnum = PayStateEnum.UNRECEIVE;
                break;

            //收货行为发生:待收货->完成
            case
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public class StatePattern { private State currentState; // Getters and setters public void setState(State state){ this.currentState = state; } public State getState(){ return currentState; } public void doAction(){ this.currentState.doAction(); } }public interface State { public void doAction(); }public class StateA implements State { @Override public void doAction(){ System.out.println("执行状态A操作"); } }public class StateB implements State { @Override public void doAction(){ System.out.println("执行状态B操作"); } }public class TestStatePattern { public static void main(String[] args){ StatePattern statePattern = new StatePattern(); statePattern.setState(new StateA()); statePattern.doAction(); statePattern.setState(new StateB()); statePattern.doAction(); } }我可以给你示例一个Java状态设计模式的代码:public class StatePattern {private State currentState;// Getters and setterspublic void setState(State state){this.currentState = state;public State getState(){return currentState;public void doAction(){this.currentState.doAction();}public interface State {public void doAction();}public class StateA implements State {@Overridepublic void doAction(){System.out.println("执行状态A操作");}public class StateB implements State {@Overridepublic void doAction(){System.out.println("执行状态B操作");}public class TestStatePattern {public static void main(String[] args){StatePattern statePattern = new StatePattern();statePattern.setState(new StateA());statePattern.doAction();statePattern.setState(new StateB());statePattern.doAction();}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值