java - Java上的有限状态机设计问题

标签 java oop inheritance fsm

我想像下面一样实现 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/

相关文章:

java - 如何抛出异常而不强制需要catch

邮件 API : Username and Password not accepted (Gmail)

javascript - Javascript 中的面向对象问题

objective-c - 我怎样才能在 Objective-C 中的两个类之间有引用?

java - 为什么在这种情况下删除通用类型会阻止覆盖?

Java - 用于验证字符串是否为 StatsD 格式的正则表达式

Java 对对象数组进行排序

用于处理大型 XML 的 Java OO 设计

c# - 允许派生类型转换为父类型返回 `object` ,但使用派生类型的方法

php - 在继承树中获取 PHP 对象的祖先