我正在使用状态模式,但我发现的示例仅用于教育目的,我想知道这种模式中在状态之间共享对象的最佳实践,即布尔值,列表还有用于一个状态对象来更改自动机对象中的状态引用。
我将制作一个简单的模型作为例子。
public abstract class State {
Automata automata;
public State( Automata automata){
this.automata = automata;
}
public abstract void action();
}
public class State1 extends State {
public State1(Automata automata){
super(automata)
}
@Override
public void action() {
// GET : Use obj1
// POST :Set in automata state to State2
}
}
public class State2 extends State {
public State2(Automata automata){
super(automata)
}
@Override
public void action() {
// GET :Use obj1
// POST :Set in automata state to State1
}
}
public class Automata {
private State state1 = new State1(this);
private State state2 = new State2(this);
private State state = state1;
public void takeAction() {
state.action()
}
}
我尝试了以下解决方案:
obj1
并使用getter和setter。对于 POST 在Automata中存储状态并使用getter和setter。这种方法会通过使用getter使代码不必要地变长,并且变得很难通过更改obj1
和状态列表来维护。State, State1
和State2
声明为私有内部类,并直接访问obj1
和状态。由于文件长度很难维护和更新。无法与其他Automata
类共享。obj1
的我找不到包私有访问。
在我的设计中,我将此模式与模板方法模式结合起来作为辅助信息。
我知道一刀切方法不存在,但使用此模式的常见最佳做法是什么?
答案 0 :(得分:1)
关注@rinde帖子后,我很好奇这是否是可接受的解决方案
public abstract class State {
public State(){
}
public abstract void action(sharedState);
public class SharedState{
Obj1 obj1;
State state1;
State state2;
State curState;
//Getters and setters
}
}
public class State1 extends State {
@Override
public void action(SharedState sharedState) {
// GET : Use obj1
sharedState.obj1.doSomething()
// POST :Set in automata state to State2
sharedState.curState = sharedState.state2;
}
}
//..same for State2
public class Automata {
State.SharedState sharedState;
public Automata(){
sharedState.setState1(new State1());
sharedState.setState2(new State2());
}
public void takeAction() {
sharedState.getCurrentState().action(sharedState);
}
}