5

多くの状態を持つステートマシンがありますA--B--C--D--ECたとえばA、ある条件が検証された場合など、多くの遷移があります。すべての状態に対して、抽象クラスStateを拡張するクラスがあり、すべての遷移メソッドを状態メソッドに委譲するマネージャーがあります。問題は、「ステートがマネージャーの遷移メソッドを直接呼び出すことができるか?」ということです。インターネット上で見たのは、遷移が何回発生したかを正確に知るメイン クラス (つまり、、、、) がある例insertQuarter()だけです。これを行う唯一の方法は、状態でマネージャー遷移メソッドを呼び出すことです。これは間違っているか悪い習慣ですか?ejectQuarter()turnCrank()dispense()

よろしくお願いします トビア

4

2 に答える 2

3

単純な同期ステートマシンが必要な場合、任意の時点で最大1回の実行が行われるため、私が考えているモデルは次のとおりです。

1)実行のコンテキストは、Contextオブジェクトによって表されます。コンテキストは状態間で受け渡され、マネージャーによるフローの決定に使用されます。コンテキストのAPIは、システムがどれだけ一般的である必要があるかによって異なります。

2)状態インターフェイスには、特定のロジックが実行されるexecute(Context)メソッドが含まれています。コンテキストデータの使用および変更が許可されています。

3)マネージャーは移行ルールで構成されます。最後の状態とコンテキストが与えられると、実行する次の状態を決定できます。初期状態を実行することから始まります。状態Sを実行するたびに、状態Sに関連付けられた遷移ルール​​に対してコンテキストオブジェクトをチェックします。最終状態に達すると、フローは終了します。

この設計では、状態の実装はマネージャーをまったく認識せず、ルーティングの決定に関与しません。

于 2010-06-10T14:24:02.207 に答える
0

はい...少なくとも私があなたの質問を正しく理解していれば。マネージャーは現在の状態への参照を保持する必要があるため、現在の状態はマネージャーに次の現在の状態に移動するように要求できる必要があります。例としてウィキペディアの例を見てください。

于 2010-06-10T15:14:38.580 に答える