4

通常のステート マシンでステート パターンを使用していました。[ A -> B ]、[ B -> C ]、[ A -> C ]から行けるようにしたかったのです。今、私たちのドメインには新しいルールがあり、[C -> A] からも移動する必要がありますが、以前に B に行ったことがない場合に限ります。したがって、メモリのある状態があります。考えられる解決策は 2 つあります。

  1. B の後に C を意味する新しいステートCBを作成し、[ A -> B ]、[ B -> CB ]、[ A -> C ]、[ C -> A ]のルールを設定します。
  2. Context には以前の状態 (StateHistoric と呼びましょう) と遷移が行われた日付 (状態履歴も顧客のドメイン要件です) のリストがあるという事実を使用し、これらのルールを使用します [ A -> B ]、[ B -> C ]、[ A -> C ]、[ Bが Context.StateHistoric にない場合はC -> A ]。

状態パターンのメモリを使用するより正しい方法は 2 つのうちどれですか? (またはこれら2の別の代替手段)

ありがとう

4

5 に答える 5

3

2番目の解決策に進みます。理解しやすく、拡張しやすくなります。

その名前があなたがやりたいことと似ているからといって、わざわざデザインパターンに固執しないでください。

于 2010-01-13T10:28:47.597 に答える
2

メモリがある場合、それは真のステート マシンではありません。この ID を維持したい場合は、オプション 1 が適切です。

于 2010-01-13T10:24:01.353 に答える
1

メモリを備えたステートマシンは存在します。それらはプッシュダウンオートマトンと呼ばれます...アイデアは、状態に到達することを読み取り、状態から抜け出すことを書き込むことができるスタックを持つことです。状態デザインパターンに関しては、コンテキスト内のMementoとして実装できると思います。

于 2010-01-16T01:44:49.973 に答える
0

オプション#2は機能します。あなたの履歴リストはどれくらいの大きさですか?リストの検索に時間がかかる場合は、オプション#3を使用します。visitedStateBのようなブールフラグをコンテキストに追加します。初期化時にこのフラグをfalseに設定します。遷移によって状態Bに移行するときに、フラグをtrueに設定します。

于 2010-01-13T23:04:41.913 に答える
0

Memento パターンのバリエーションと一緒に State パターンを実装しますか?

于 2012-03-20T01:28:58.220 に答える