我正在使用状态模式,但我发现的示例是为了教育目的,我想知道这种模式中用于在状态()之间共享对象()的最佳实践是什么,即一个布尔值、一个列表以及一个状态对象的,以更改自动机对象中的状态引用。
我将建立一个简单的模型作为一个例子。
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。用于自动机中的邮政存储状态,并使用getter和setter。通过使用getter,这种方法将使代码变得不必要的长,并且随着obj1和状态列表的改变而变得难以维护。State, State1和State2声明为私有内部类,并直接访问obj1和states。由于文件的长度很难维护和更新。不能与其他Automata类共享。obj1的我不太了解包的私密性。
在我的设计中,我将此模式与模板方法模式作为附带信息结合在一起。
我知道不存在一刀切的方法,但是在使用这种模式时最常见的最佳实践是什么呢?
发布于 2016-01-26 09:25:59
我会这样做:
public class Automata {
List<String> someList;
boolean someBoolean;
private State currentState;
public void performAction() {
currentState = currentState.action(this);
}
interface State {
State action(Automata context);
}
enum States implements State {
IDLE {
@Override
public State action(Automata context) {
if (context.someBoolean) {
return WORKING;
}
return this;
}
},
WORKING {
@Override
public State action(Automata context) {
if (context.someList.size() > 7) {
return IDLE;
}
return this;
}
}
}
}状态的设置现在在performAction() of Automata中完成,无需在每个状态中执行。我使用enum作为状态的实现,因为当您想要将状态实现为纯函数时,它们是很棒的。但是,如果您的状态本身并不是无状态的,您可能希望将这些状态实现为静态内部类。
https://stackoverflow.com/questions/35009839
复制相似问题