gpt4 book ai didi

java - 状态模式实现困难

转载 作者:行者123 更新时间:2023-12-01 23:15:57 25 4
gpt4 key购买 nike

我在应用程序中使用状态模式,因为我的状态实体具有API,其行为会因当前状态而变化。

在我的例子中,状态相关的 API 仅由一种方法组成 - changeState。此方法会更改状态并执行一些与状态相关的逻辑。

但有一种情况让我问这个问题:状态依赖逻辑不仅取决于当前状态,还取决于 newState(请参见下面的代码)。所以我必须使用instanceof

问题: 摆脱 instanceof 的真正方法是什么?

public interface IStateEntity {
void changeState(IState newState);
}

public interface IState {
void doStateDependentLogic(IState newState);
}

public class StateEntityImpl {

private IState state;

@Override
public void changeState(IState newState) {
state.doStateDependentLogic(newState);
state = newState;
}
}

public class StateImplA { //each state implementation is a singleton

@Override
public void doStateDependentLogic(IState newState) {
// HARDSHIP #1: state dependent logic depends not only on current state, but also it depends on newState. So I have to use `instanceof`
if (newState instanceof StateImplA) {
//do one logic
} else if (newState instanceof StateImplB) {
//do another logic
}
}
}

编辑(为什么不枚举):

如果枚举替换getClass().getSimpleName():因为它是函数式编程范例。当我以依赖于 className 的方式构建架构时,这是出现问题的第一个迹象。对我来说,将 instanceof 更改为 enum 并不意味着改变架构,但只会让一个坏的变得更糟。

如果将每个 IState 实现作为枚举:每个 IState 实现都是 Hibernate 实体。

最佳答案

Java 中创建单例的公认方法是使用enum。这提供了线程安全的初始化以及 JVM 保证的单例状态。有很多方法可以创建不是 enumclass 的第二个实例。

使用enum的额外好处是,您可以在逻辑中对enum进行大小写切换:

public enum State {

STATE_A {
@Override
public void doStateDependentLogic(final State newState) {
switch (newState) {
case STATE_B:
//do stuff
//case SOME_OTHER_STATE
}
}
},
STATE_B {
@Override
public void doStateDependentLogic(final State newState) {
}
};

public abstract void doStateDependentLogic(State newState);
}

我不知道您从哪里得知枚举是一种函数式编程范例。不是这种情况。 Java 中的 enum 旨在完全满足您的需求。

关于java - 状态模式实现困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21208729/

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