gpt4 book ai didi

java - 如果您的目标状态不是下一个状态,应使用哪种状态机设计?

转载 作者:行者123 更新时间:2023-11-30 06:08:28 25 4
gpt4 key购买 nike

我去过 reading up on State Machines因为它可能需要用于我的下一个项目。我在网上找到的大多数示例都展示了如何从 StateA 转到 StateB。但是,如果您的下一个期望状态不是相邻状态怎么办?是否有任何共同的模式/实践来实现这一目标?最好使用 Java,但我也可以阅读其他编程语言。

# Example States
WakeUp->Get Dressed->Get Car Keys->Get in Car->Drive to Work->Work

Current State: Get in Car

要解决的问题

# Scenario 1: Desired State == Work
Forgot car keys, so you have to return to previous state and then move forward in states again.

# Scenario 2: Desired State == Work
Have car keys, so move forward in states to get to Desired State.

状态机很可能无法优雅地解决这个问题,我只需要手工制作逻辑,我不介意,但我想我会遵循一个通用的设计模式来帮助其他人理解它。

从上面的例子来看,我不需要担心“内部”状态,这对于我正在处理的项目也是如此;以防万一,可能的解决方案有所不同。

最佳答案

这是定义状态机的简单方法。

在枚举中定义您想要的所有状态。

enum StateType {
WAKE_UP, GET_DRESSED, GET_CAR_KEYS, GET_IN_CAR, DRIVE_TO_WORK, WORK
}

有一个控制状态的状态机,以及一个在状态机上执行操作的状态接口(interface)。然后状态返回下一个状态去。

interface State {
StateType next(StateMachine sm);
}

为多种类型实现这个状态

class GetInCarState implements State {
@Override
public StateType next(StateMachine sm) {
if (sm.hasKeys()) {
return StateType.DRIVE_TO_WORK;
}
return StateType.GET_CAR_KEYS;
}
}

现在定义状态机

class StateMachine {
private Map<StateType, State> states = new HashMap<StateType, State>() {{
put(StateType.WAKE_UP, new WakeUpState());
put(StateType.GET_DRESSED, new GetDressedState());
put(StateType.GET_CAR_KEYS, new GetCarKeysState());
put(StateType.GET_IN_CAR, new GetInCarState());
put(StateType.DRIVE_TO_WORK, new DriveToWorkState());
put(StateType.WORK, new WorkState());
}};

private StateType currentState = StateType.WAKE_UP;

private boolean hasCarKeys;

public boolean hasKeys() {
return hasCarKeys;
}

public void setHasKeys(boolean hasKeys) {
hasCarKeys = hasKeys;
}

public void update() {
currentState = states.get(currentState).next(this);
}
}

关于java - 如果您的目标状态不是下一个状态,应使用哪种状态机设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com