我想像下面一样实现 FSM
- 第一级最基本的状态是 BASE_STATE。全部 状态源自 BASE_STATE。
- 第二级,WAITING_STATE, RUNNING_STATE、END_STATE...等等 (源自 BASE_STATE。没有新的 功能)
- 第三级,有2组 状态(主动和被动), 所有二级状态的一对一匹配 喜欢
ACTIVE_WAITING_STATE、ACTIVE_RUNNING_STATE、ACTIVE_END_STATE,依此类推 PASSIVE_WAITING_STATE、PASSIVE_RUNNING_STATE、PASSIVE_END_STATE 等等
大多数功能对于 ACTIVE 和 PASSIVE 状态都是通用的,只是一些小功能被覆盖。到这里为止都没有问题。问题是,所有第三级小组都有共同的职能。我的意思是,例如我必须实现2个不同的increment()函数,其中一个是ACTIVE_xxx_STATEs,另一个是PASSIVE_xxx_STATEs。如何在不重写所有状态的情况下执行此操作(例如 ACTIVE_WAITING_STATE 、 ACTIVE_RUNNING_STATE 、ACTIVE_END_STATE 以及 PASSIVE 状态)
为了澄清我的问题,我丑陋的 Solr 'n。 问题是增量函数是相同的,并且为所有 ActivexxxState(以及 PassiveXXXState)重写。
public class BaseState {
// Lots of functions
}
public class WaitingState extends BaseState{
// Lots of functions
}
public class RunningState extends BaseState{
// Lots of functions
}
public class EndState extends BaseState{
// Lots of functions
}
public Class ActiveWaitingState extends WaitingState {
// Few unique functions
private void increment() {
System.out.println("increment active");
}
}
public Class ActiveRunningState extends RunningState {
// Few unique functions
private void increment() {
System.out.println("increment active");
}
}
public Class ActiveEndState extends EndState {
// Few unique functions
private void increment() {
System.out.println("increment active");
}
}
public Class PassiveWaitingState extends WaitingState {
// Few unique functions
private void increment() {
System.out.println("increment passive");
}
}
public Class PassiveRunningState extends RunningState {
private void increment() {
System.out.println("increment passive");
}
}
public Class PassiveEndState extends EndState {
private void increment() {
System.out.println("increment passive");
}
}
最佳答案
我会将increment()设置为BaseState中的 protected 方法,因此它只实现一次。
<小时/>我写了一篇关于使用 enums to build a state machine 的文章。这可以避免为每个状态到处创建类的需要,并且仍然支持一些继承。
<小时/>回复您的评论。
abstract class BaseState {
public abstract boolean isPassive();
public boolean increment() {
System.out.println("increment "+(isPassize() ? "passive" : "active");
}
}
class PassiveState {
public boolean isPassive() { return true; }
}
如果您不想有多个 isPassive 方法,您可以采用类命名约定
public boolean isPassive() { return getClass().getSimpleName().startsWith("Passive"); }
关于java - Java上的有限状态机设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6535508/