我有一个类似的类:
public class Machine {
enum State {
STARTED, STOPPED
}
private State state;
private String whyIsItStopped; // only used in STOPPED state
...
}
我想知道做这件事的正确方法是什么。我有一个更复杂的班级,如果我这样做似乎是一团糟。
问题出在我的架构中,您能给我一些建议吗?
update
使用状态模式,我带有几乎解决方案,例如:
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());
}
另一种方法可能是仅在停止状态上设置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
在体系结构或利用中很奇怪。
您还有其他解决方案,比实例更好?
您的问题对于状态模式来说似乎是一个明显的情况。它将允许您实现可以在不修改已经存在的代码的情况下扩展新状态的解决方案。
状态模式是一种行为软件设计模式 以面向对象的方式实现状态机。与国家 模式,通过实施每个机器可以实现状态机器 单个状态作为状态模式接口的派生类别, 并通过调用由 模式的超类。