MVP パターンを JDialog に適用する
-
21-08-2019 - |
質問
私は Swing アプリケーションを書いていますが、さらに 私の前の質問, 、を使用することに落ち着きました。 モデル-ビュー-プレゼンター ユーザー インターフェイスをビジネス ロジックから分離するパターン。
アプリケーションが起動すると、次のコードが実行されます。
Model model = new BasicModel();
Presenter presenter = new Presenter(model);
View view = new SwingView(presenter);
presenter.setView(view);
presenter.init();
ユーザーインターフェイスを作成します。イベントは次によって生成されます。 View
, 、に委任されています。 Presenter
. 。の Presenter
次に、 Model
そして更新します View
それに応じて。
一部のイベントを処理するには、ユーザーからさらに情報を取得する必要があります。これらのイベントの場合、Swing ビューが新しいビューを生成するのが適切であると考えます。 JDialog
窓。
たった 1 つの考え方で、これは元のコードでは適切なコードかもしれないと感じます。 Presenter
:
public void handlePreferences() {
Preferences prefs = view.getPreferences();
model.setPreferences(prefs);
}
つまり、それぞれの内容は、 JDialog
から取得する必要がある個別のオブジェクトを表す必要があります。 View
で更新されました Model
. 。しかし、これでは次のような疑問が残ります。新しいものを作成しますか Model
を表すために Preferences
オブジェクトと新しい Presenter
その中でのイベント処理のために JDialog
?
新しいものを作るような気がします Presenter
そして Model
オリジナルの内部 View
たとえば、JSF を使用するように UI を変更したい場合、移植がより困難になる多くの作業を強いられることになります。
明確にするためにお気軽にコメントを追加してください。
解決
それはあなたの場合には必要ありません。他の回答に描画ます:
モデル の
- すべての実データ、変数、オブジェクトが含まれています
- 新しい値にその格納されたデータ値を設定する方法を知っている
-
注文(メソッド呼び出し)に応答
- メソッドsetPreferences(値1、値2、値3 ...)を持っている。
表示
- IOは、アプリケーション、単に出力と入力のためである
- それだけで、その状態で、その自己上で動作することができ
- それは、例えば、ローカル変数やオブジェクトを保持します。それは
JButtonが、JMenus、int型のカウンタを持っています...
- それはあるが状態変更のプレゼンターを通知する方法を知っている
- その状態がプレゼンターに表示される、またはメソッド呼び出しによって明らか
-
注文(メソッド呼び出し)に応答
- ユーザーからの好みを取得する方法を知っている
- メソッドaskForPrefs()を有し、
- 方法getPrefState()を有し;
のプレゼンターの
- 状態変化に応答し
- すべての決定は、
(それをしないか)どうするか、他のオブジェクトに伝えるん
- プリファレンスが
必要とされたときに知っています
- どこ新しい設定を取得し、それらを配置する場所を知っている
- 方法newPrefsAvailable()を有し;
...ユーザーからの更なる情報を取得します。これらのイベントの場合、私は、Swingビューは新しい使って、JDialogウィンドウを起動することが適切であると考えています。
プレゼンター - 、モデルをチェックし、新しい設定が
を必要としている決定
プレゼンター - this.myView.askForPrefs(); //は、県の値をユーザーに依頼するビューを伝え
View.askForPrefsは - JDialogのボックス、状態の変化としてビューに保存されているretValsをポップアップ表示
ビュー - this.myPresenter.newPrefsAvailable();
プレゼンター - this.myModel.setPreferences(this.myView.getPrefState())で応答し、
Model.setPreferences - View.getPrefStateに格納された値を変更する()
プレゼンターは - モデルをチェック - 好みは良質ある決定します
プレゼンター -
に続きます
JDialogのは、ビューの単なる延長として扱われ、次のようになりちょうどJButtonのようなビューのメンバーです。 モデルは、権限の実際の嗜好値を有し、そしてビューはJDialogの状態を表すローカル変数があります。
他のヒント
私のアドバイスは、これらの好みは「基本的には何かを考えることであろう。彼らは、基礎となるビジネス・ロジックの一部はありますか?もしそうなら、彼らは、モデルstructreの一部である必要があります。彼らは、ビジネスデータとの相互作用のユーザの好みの方法を指定していますか?その後、彼らはビューの一部でなければなりません。それは理論的に見えるかもしれませんが、私の経験では、それは最終的に頭痛の多くを保存します。
あなたはそれをうまくできない場合は、その後、設定を保存している場所をあなたに別の手がかりを与えます。彼らは、操作されているデータと一緒に保存する必要があるならば、彼らはおそらく、ビジネスロジックの一部です。彼らは、ユーザーの個人的な好みのファイルに保存されている場合はそうではありません、とビューを考慮すべきである。
いいえ、設定のためだけに別の「モデル」は必要ありません
JDialog のコンストラクターでプレゼンターとモードを引数として渡すだけです。大きな Swing アプリケーションをプログラムするのは、
- 1モデル
- コントローラー 1 個 (コントローラー自体に小さいコントローラーが含まれる場合があります)
- 複数のビュー (ただし、同じデータ/モデル クラス上)
1 モデル != 1 クラスであることに注意してください。スイングアプリケーションの「モデル」は、実際には、共通の「ルート」を持つ「モデル」クラスの「モデル」クラスの「ツリー」にすることができます。
したがって、あなたの場合、必要なのは
「グローバル」モデル -> (を含む) 「プリファレンス」モデル。