私の提案:
「トランジション管理」を構成可能にしてください(つまり、XMLを介して)。
状態を保持するリポジトリに XML をロードします。
内部データ構造は Map になります。
Map<String,Map<String,Pair<String,StateChangeHandler>>> transitions;
私が選択した理由は、これが状態名から
「入力」と新しい状態のマップへのマップになるためです。
各マップは、可能な入力と、状態名によって定義される新しい状態との間のマップを定義します。 StateChangeHandler については後で詳しく説明し
ます。リポジトリの状態変更メソッドには、次の署名があります。
void changeState(StateOwner owner, String input)
このように、状態所有者がそれを使用するという意味で、リポジトリはステートレスであり、1 つのコピーをコピーでき、
スレッド セーフの問題を心配する必要はありません。
StateOwner は、状態の変更が必要なクラスが実装する必要があるインターフェイスになります。
インターフェイスは次のようになると思います。
public interace StateOwner {
String getState();
void String setState(String newState);
}
さらに、ChangeStateHandler インターフェイスがあります。
public interface StateChangeHandler {
void onChangeState(StateOwner, String newState) {
}
}
リポジトリの changeState メソッドが呼び出されると、
stateOwner の現在の状態に「入力」のマップがあることをデータ構造でチェックします。そのようなマップがある場合、入力に変更する新しい State があるかどうかを確認し、onChangeState メソッドを呼び出します。
StateChangeHandler のデフォルトの実装と、もちろん、状態変更の動作をより明示的に定義するサブクラスを用意することをお勧めします。
前述したように、これらはすべて XML 構成からロードでき、リフレクションを使用すると、(XML で説明したように) 名前に基づいて StateChangeHandler オブジェクトをインスタンス化し、リポジトリに保持できます。
効率と優れたパフォーマンスは、次の点に依存し、取得されます。
を。リポジトリ自体はステートレスです - StateOwner の内部参照は保持されません。
b. システムの起動時に XML を 1 回ロードすると、その後はインメモリ データ構造で作業する必要があります。
c. 必要な場合にのみ特定の StateChangeHandler 実装を提供します。デフォルトの実装は基本的に何もしません。
d. ハンドラーの新しいオブジェクトをインスタンス化する必要はありません (ステートレスである必要があるため)