gpt4 book ai didi

java - 更改状态时添加附加内容的正确方法是什么

转载 作者:行者123 更新时间:2023-12-01 20:55:39 25 4
gpt4 key购买 nike

我有一个这样的类(class):

public class Machine {
enum State {
STARTED, STOPPED
}

private State state;
private String whyIsItStopped; // only used in STOPPED state

...
}

我想知道执行此操作的正确方法是什么。我有一个更复杂的类,如果我这样做,它似乎会变得一团糟。

问题出在我的架构上,你能给我一些建议吗?

更新

使用状态模式,我得到了一个几乎像这样的解决方案:

public interface State {

public String whyIsItStopped();

public class Started implements State {
@Override
public String whyIsItStopped() {
return null;
}
}

public class Stopped implements State {
private final String reason;

public Stopped(String reason) {
this.reason = reason;
}

@Override
public String whyIsItStopped() {
return reason;
}
}
}

public class Machine {

private State state = new State.Started();

public String whyIsItStopped(){
state.whyIsItStopped();
}

// setState etc ...
}

状态模式对于改变同一方法的行为似乎很好,但对于附加字段/数据来说很奇怪。

问题是它并不是真正的同一个对象,多态性并不能真正发挥作用。我必须在获取其内容之前测试机器是否已停止(作为实例的方式)

if (machine.isStopped()){
println(machine.whyIsItStopped());
}

另一种方法可能是仅在 Stopped 状态下设置 getter

public interface State {

public class Started implements State {}

public class Stopped implements State {
private final String reason;

public String whyIsItStopped() {
return reason;
}
}
}

并检索消息:

if (machine.isStopped()){
println(((State.Stopped)machine.getState()).whyIsItStopped());
}
// Yeah that's not really beautiful

无论是在架构上还是在使用上都很奇怪。

你还有比instanceof更好的其他解决方案吗?

最佳答案

您的问题似乎是 State Pattern 的明显例子。它将允许您实现一个可以使用新状态进行扩展的解决方案,而无需修改现有代码。

The state pattern is a behavioral software design pattern that implements a state machine in an object-oriented way. With the state pattern, a state machine is implemented by implementing each individual state as a derived class of the state pattern interface, and implementing state transitions by invoking methods defined by the pattern's superclass.

关于java - 更改状态时添加附加内容的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42414489/

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