以下のようにFSMを実装したい
- 第 1 レベル最も基本的な状態は BASE_STATE です。すべての状態は BASE_STATE から派生します。
- 第 2 レベル、WAITING_STATE、RUNNING_STATE、END_STATE など (BASE_STATE から派生。新しい機能はありません)
- 第 3 レベル, 2 つのグループ状態 (ACTIVE と PASSIVE) があり、次のようなすべての第 2 レベル状態に 1 対 1 で一致します
ACTIVE_WAITING_STATE 、 ACTIVE_RUNNING_STATE 、 ACTIVE_END_STATE など PASSIVE_WAITING_STATE 、 PASSIVE_RUNNING_STATE 、 PASSIVE_END_STATE など
ほとんどの機能は ACTIVE 状態と PASSIVE 状態で共通ですが、いくつかの小さな機能がオーバーライドされているだけです。ここまでは問題ありません。問題は、すべての第 3 レベルのグループが共通の機能を持っていることです。つまり、たとえば、ACTIVE_xxx_STATEs と PASSIVE_xxx_STATEs という 2 つの異なる increment() 関数を実装する必要があります。すべての状態 (例: ACTIVE_WAITING_STATE 、 ACTIVE_RUNNING_STATE 、 ACTIVE_END_STATE 、および PASSIVE 状態) を書き換えずにこれを行う方法
私の質問を明確にするために、私の醜いソルン。問題は、インクリメント関数が同じで、すべての 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");
}
}