首页 > 其他分享 >状态机

状态机

时间:2024-03-13 10:56:42浏览次数:21  
标签:状态 next 状态机 ProcessState public currentState

在Java程序中实现一个状态机,你可以采用几种不同的设计模式。

1.第一版状态机

下面是一个简单的状态机实现,使用了枚举类型来表示状态,并且使用了状态模式(State Pattern)来实现状态之间的转换。

public enum ProcessState {
    STARTED,
    IN_PROGRESS,
    FINISHED
}

接下来,定义状态机的上下文环境,它将持有当前的状态,并允许你改变状态:

public class ProcessContext {
    private ProcessState currentState;

    public ProcessContext() {
        currentState = ProcessState.STARTED; // 初始状态
    }

    public void setCurrentState(ProcessState state) {
        this.currentState = state;
    }

    public ProcessState getCurrentState() {
        return currentState;
    }

    public void next() {
        switch (currentState) {
            case STARTED:
                setCurrentState(ProcessState.IN_PROGRESS);
                break;
            case IN_PROGRESS:
                setCurrentState(ProcessState.FINISHED);
                break;
            case FINISHED:
                System.out.println("Process is already finished.");
                break;
        }
    }
}

在这个例子中,ProcessContext 类拥有一个 currentState 属性来跟踪当前的状态,并有一个 next 方法来转移到下一个状态。这是一个非常简单的状态机,它假定状态的转换是线性的(从开始到进行中,再到结束)。

2.第二种状态机

如果你的状态转换更加复杂,或者你需要在状态转换时执行更多的逻辑,你可以为每个状态创建一个单独的类,并实现一个共同的接口。这样,每个状态都可以有自己的转换逻辑。这是状态模式的一个例子:

public interface ProcessState {
    void next(ProcessContext context);
}
public class StartedState implements ProcessState {
    @Override
    public void next(ProcessContext context) {
        // 在这里实现从开始到进行中状态的逻辑
        context.setCurrentState(new InProgressState());
    }
}

public class InProgressState implements ProcessState {
    @Override
    public void next(ProcessContext context) {
        // 在这里实现从进行中到结束状态的逻辑
        context.setCurrentState(new FinishedState());
    }
}

public class FinishedState implements ProcessState {
    @Override
    public void next(ProcessContext context) {
        // 已经是结束状态,可能不需要做任何事情,或者抛出一个异常
        System.out.println("Process is already finished.");
    }
}

public class ProcessContext {
    private ProcessState currentState;

    public ProcessContext() {
        currentState = new StartedState(); // 初始状态
    }

    public void setCurrentState(ProcessState state) {
        this.currentState = state;
    }

    public void next() {
        currentState.next(this);
    }
}

在这个状态模式的实现中,每个状态都是一个实现了 ProcessState 接口的类。这样,每个状态类都可以有自己的 next 方法,负责处理状态转换的逻辑。ProcessContext 类持有一个 ProcessState 类型的对象,代表当前的状态,并通过调用当前状态的 next 方法来进行状态转换。

在实际应用中,状态模式可以很好地处理更复杂的状态机逻辑,每个状态可以有自己的行为,甚至可以根据不同的条件转移到不同的状态。这种设计也更容易扩展和维护。

标签:状态,next,状态机,ProcessState,public,currentState
From: https://www.cnblogs.com/PythonOrg/p/18070150

相关文章

  • Spring状态机(FSM),让订单状态流转如丝般顺滑
    引言在复杂的应用程序设计中,尤其是那些涉及多个状态变迁和业务流程控制的场景,有限状态机(FiniteStateMachine,FSM)是一种强大而有效的建模工具。Spring框架为此提供了Spring状态机(SpringStateMachine)这一组件,它允许开发者以一种声明式且结构清晰的方式来管理和控制对象的状态......
  • 利用正则与状态机解析HTTP请求报文,实现处理静态资源的请求
    要使用正则和状态机来解析HTTP请求报文,首先需要理解HTTP请求报文的基本结构。一个典型的HTTP请求报文如下:GET/index.htmlHTTP/1.1Host:www.example.comUser-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110......
  • 3-4. 有限状态机&抽象类多态
    创建有限状态机基类实现有限状态机野猪巡逻状态继承BaseState,将原来Enemy的Update里面的一部分移动到LogicUpdate里面使用有限状态机定义状态定义巡逻状态、追逐状态、当前状态Enable进入巡逻状态Disable退出当前状态Update调用状态机的逻辑更新Awake......
  • 状态机模式的初步了解及学习心得体会
    这种模式,解决的是,程序在不同状态切换及增加新的状态时,需要改很多代码的问题。它能用简单的逻辑控制程序从一个状态切换为其他被允许的状态,我昨天在网上看的一个例子,一个播放器,有播放,暂停,关闭的状态。处于关闭状态时,只能响应播放的代码;处于暂停状态时,能响应关闭和播放代码;处于播放......
  • 状态机
    状态机四大概念状态(State)一个状态机至少包含两个状态,并且有初始状态。事件(Event)一个行为,一个动作的触发条件,一个事件对应一个动作。动作(Action)事件发生后要执行的动作。执行完动作后要有相应的状态变换。变换(Transition)表示一个状态变成另一种状态的过程。在执行......
  • 实现一个状态机
    问题的描述最近在改仿真软件的状态切换,什么意思呢,这东西有点像个播放器,但是不仅仅是播放暂停那么简单。首先我们画一个图,以一个图说明:  通过以前的面向对象设计经验我们知道有一种叫状态机的东西,简而言之就是把每个状态通过节点对象包装,节点是什么类型就是当前处于什么状态,......
  • 实现一个所谓的状态机
    问题的描述最近在改仿真软件的状态切换,什么意思呢,这东西有点像个播放器,但是不仅仅是播放暂停那么简单。首先我们画一个图,以一个图说明:  通过以前的面向对象设计经验我们知道有一种叫状态机的东西,简而言之就是把每个状态通过节点对象包装,节点是什么类型就是当前处于什......
  • 支付系统的心脏:简洁而精妙的状态机设计与核心代码实现
    这是《百图解码支付系统设计与实现》专栏系列文章中的第(9)篇。本篇主要讲清楚什么是状态机,简洁的状态机对支付系统的重要性,状态机设计常见误区,以及如何设计出简洁而精妙的状态机,核心的状态机代码实现等。我前段时间面试一个工作过4年的同学竟然没有听过状态机。假如你没有听过状态机......
  • Unity引擎2D游戏开发,有限状态机&抽象类多态
    状态机与抽象类观察如下代码:publicclassAttackFinish:StateMachineBehaviour{//OnStateEnteriscalledwhenatransitionstartsandthestatemachinestartstoevaluatethisstateoverridepublicvoidOnStateEnter(Animatoranimator,AnimatorStateIn......
  • 【FPGA基础】状态机
    状态机由状态寄存器和组合逻辑电路组成;在不同的当前状态下,能够控制信号的变化进行状态的转移,从而实现相关信号的赋值,完成特定控制时序的设计。状态机的三个基本要素:      状态变迁(当前状态current_state和下一状态next_state      输入条件(状态变化的触发事件 ......