問題タブ [state-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1384 参照

java - Implementing State Pattern

I am implementing a state pattern in Java for my application and need few clarifications.

The state machine has 5 states State 1 to State 5. The are a total of 5 events(Event1 to Event5) which causes the state transition. Not all events are applicable in all the states. If the event is not applicable in that particular state the application will throw exception.

When the state machine gets initialized it starts with state1.

Following is the interface and the context class.

To make it simple, I have provided implementation for only one state.

I want to release the lock only after entering state. Also I don't want to hold the lock till enter() finishes. If I hold the lock till enter finishes I cannot handle other events and it may get timed-out.For some events (which don't really change the state) we need to read the state and based on the state we can process them or ignore them. If I don't release lock they cannot be processed.Also in some other cases if an event comes to shutdown(this event changes the state) the state machine while enter() is in progress I cannot handle it. I have to shutdown the state machine immediately since it is not appropriate in continuing the enter() after shutdown event has come.

My Question: Is it good java programming practice to expose the accquireLock and releaseLock as an API in Context class and use them in each state class.

Thanks, Arun

0 投票する
2 に答える
4772 参照

oop - 状態パターンと戦略パターンの違い

GoF パターンを見ると、State パターンと Stategy パターンの類似点がかなり際立っていることがわかります。どちらもポリモーフィック クラスを交換して動作を変更します。他の誰かが同じことを見つけましたか?

正確な違いは何ですか?

0 投票する
3 に答える
3195 参照

oop - メメントデザインパターンとステートデザインパターン

元に戻すなど、オブジェクトを以前の状態に戻すには、Memento デザイン パターンが使用されます。ただし、取り消しとやり直しは複数回実行できます。私は記事を何度も読みましたが、それらが互いに類似しているか補完しているか、一緒に使用できるかについてはまだ不明です.

State パターンを Memento Design パターンに関連付けたり、一緒に使用したりできますか?

0 投票する
2 に答える
109 参照

design-patterns - 状態パターンの長い状態クラス名

私はアプリケーションで 28 州の州パターンを使用しています。州は 7 つの主要な州を持つ会員カード用です。実際にその動作に影響を与える会員カードには 4 つのブール属性があるため、それらを州に埋め込むことにしました。それがどのように28州に増えたか。

問題は現在、状態クラスの命名にあり、それは狂っています。私はこのMembership-UnderCreation-Printed-Linked-Premium-Frozenのような名前のクラス状態になってしまいます-----明確にするためにさまざまな属性にハイフンを付けました。

状態クラス名はこんな感じでいいの!? ベストプラクティスのために何をすべきですか?

0 投票する
1 に答える
138 参照

android - Android - レイアウトからすべてのボタンをクリアし、状態クラスに従って再挿入する方法はありますか? (ステートデザインパターン)

ごあいさつ Stackoverflowians

私はAndroidカードゲームアプリに取り組んでいます。ゲームの特定の State にいる 2 人の Player のいずれかが異なるアクションを利用できることを考慮して、State Design Pattern (State Machine) を使用して実装した GameClass にゲーム全体のダイナミクスを組み込みました。

たとえば、ゲームの開始時に、プレーヤー A は、GameClass が持つ合計 21 個のメソッドのうち 5 個しか実行できません。どのアクションとカードがプレイされるかに応じて、メソッドはさまざまな状態に移行し、さまざまな状態ごとにさまざまなメソッドが利用可能になります。

したがって、各メソッドのブール値を設定および取得する CurrentActions というクラスを使用して、さまざまなメソッドの可用性を解決しました。したがって、プレイヤーがゲームの開始時に選択できるアクションをプレイヤーに示したい場合は、一連の IF (約 21...) を使用して、Getter のいずれかが true に設定されているかどうかを確認します。ボタンをレイアウトに追加すると、すべてが魅力的に機能します。

さて、私の最大の問題は、最初の状態のボタンを表示する方法がわからないことです。その後、プレーヤー A がそれらのボタン (メソッド) の 1 つをクリックすると、以前の状態で使用可能だったすべてのボタンがフラッシュされ、現在表示されています。ゲームの新しい状態の新しいボタン。

これを行う方法はありますか?私はすでに Layout.removeAllViews() メソッドを使用してすべてのボタンをクリアしていますが、次の State に従ってすべてのボタンを再度設定することが私の最大の問題です。この件に関する何らかのガイダンスをいただければ幸いです。

コードを表示したいというあなたのリクエストに応えて、ゲーム、レイアウト、ボタン、および可能なアクションを処理するコードをアクティビティに追加しました。

ゲーム内に存在するすべてのアクションに対して、これらの IF の 1 つを用意します。だから....(ゲームの状態に応じて)利用可能なボタンの1つをクリックした後、actionsLayoutをクリアしてボタンの新しいセットを実行し、ボタンを押すたびにこれを継続的に実行する方法はありますか(つまり、状態が変化するたびに)?

0 投票する
0 に答える
84 参照

design-patterns - State パターンを使用する場合、時間のかかる遷移は本当に単なる状態ですか?

State パターンを使用して、物理マシンを制御するサービスを設計しています。マシンには、Open 状態と Closed 状態があります (他にもいくつかの便利な状態があります)。さらに、Open ==> Close のようなトランジションがあります。

これらの遷移は、時間がかかる物理的なプロセスを開始します。本当にそれらを状態としてモデル化する必要があるかどうか疑問に思っています。

一方で、これらはマシンが期待する安定した状態ではありません。複数の動作がなく、コマンドを受け入れません。Opening はただ 1 つのことを行います - それは Open に移行します。

一方で、私は、人々がサービスを照会して、その状態が何であるかについて実際の回答を得られるようにしたいと考えています。プロセスが私の状態を要求し、Open コマンドをマシンに送信したが、それが開始を完了していない場合、状態に対して何を返す必要がありますか? オープニングは正しいですね。

アドバイス?知恵?2 つのアプローチの間にトレードオフはありますか?

0 投票する
1 に答える
1190 参照

java - 状態パターンとカプセル化

私は最近 Java アプリケーションを開発しており、GoF の状態パターンに従ってコードを整理しようとしています。

このプログラムは、マルチエージェント システムのエージェントを使用して、「スーパー エージェント」に代わって命令を評価します (以下の例)。

スーパー エージェントは 2 つの状態で存在することができ、状態をチェックしてから状態固有の動作を実行する if ステートメントを至る所に配置するのは面倒です。

これは、プログラムの (非常に) 単純化されたバージョンです。実際の実装には、より多くの状態固有の動作があります。

状態パターンは、特定の状態の動作を GoF パターンに従ってさまざまなクラスにカプセル化するのに最適です (superAgent クラスがコンテキストになります)。ただし、2 つの問題があり、どちらも (IMO) カプセル化を破ります。

  1. ほとんどの状態固有の動作では、スーパー エージェントのプライベート メンバー (上記の例では、instructionData) を変更する必要があります。メンバーには、おそらくアクセスできないはずのデータが含まれており、ラッピング クラスに対して変更可能であってはなりません

  2. 状態固有の動作は、状態固有ではない動作と同期する必要があります。ロック オブジェクト (上記の例の instructionLock) を公開するかゲッターを使用して公開しないと、状態とコンテキストはロックを共有できません。ロックを公開すると、ラップ/拡張クラスで使用される可能性があるため、OOP に違反します。

上記の例と2つの点を念頭に置いて、この状態固有の動作をカプセル化する方法について誰か提案がありますか?