3

私は Swing アプリケーションを作成しており、前の質問に加えて、Model-View-Presenterパターンを使用してユーザー インターフェイスをビジネス ロジックから分離することにしました。

アプリケーションが起動すると、次のコードが実行されます。

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必要がある個別のオブジェクトを表す必要があります。ただし、これには疑問が残ります。オブジェクトを表すために new を作成し、その中でイベント処理のために new を作成する必要がありますか?ViewModelModelPreferencesPresenterJDialog

たとえば、JSF を使用するように UI を変更したい場合、元の内部に新しいものを作成するPresenterと、移植が難しくなる多くの作業を強いられるように思えます。ModelView

明確にするためにコメントを追加してください。

4

3 に答える 3

8

「ネストされた」設計パターンを持つことは珍しくありませんが、あなたの場合は必要ありません。他の答えを引き出す:

モデル
 - すべての実際のデータ、変数、オブジェクトが含まれます
 - 格納されたデータ値を新しい値に設定する方法を知っています
 - 注文 (メソッド呼び出し) に応答します -
 メソッド setPreferences(value1,value2,value3...) を持っています;

ビュー
 - アプリケーションの IO であり、出力と入力だけです。
 それ自体、その状態でのみ機能し
 ます。ローカル変数とオブジェクトを維持します。JButton、JMenus、int カウンタがあります...
 - 状態の変化をプレゼンターに通知する方法を知っています
 - その状態はプレゼンターに表示されるか、メソッド呼び出しによって明らかにされます
 - 命令 (メソッド呼び出し) に応答します -
 取得する方法を知っていますユーザーからの設定
 - メソッド askForPrefs() があります。
 - getPrefState(); メソッドがあります。

プレゼンター
 - 状態の変化に応答します
 - すべての決定を行い、他のオブジェクトに何をすべきかを伝えます (方法ではありません)
 - 設定がいつ必要になるかを
 知っています - 新しい設定をどこで取得し、どこに置くかを知っています
 - メソッド newPrefsAvailable( );

... ユーザーから詳細情報を取得します。これらのイベントの場合、Swing ビューが新しい JDialog ウィンドウを生成するのが適切だと思います。

プレゼンター - モデルをチェックし、新しい設定が必要かどうかを判断します
プレゼンター - this.myView.askForPrefs(); // ユーザーに設定値を尋ねるようにビューに指示します
View.askForPrefs - JDialog ボックスをポップアップ表示し、retVals を状態変更としてビューに格納します
View - this.myPresenter.newPrefsAvailable();
プレゼンター - this.myModel.setPreferences (this.myView.getPrefState()); で応答します。
Model.setPreferences - 保存された値を View.getPrefState() に変更します
Presenter - モデルをチェックします - 設定が適切かどうかを判断します
Presenter - 続行します

JDialog はビューの単なる拡張として扱われ、JButton と同じようにビューのメンバーです。モデルには信頼できる実際の設定値があり、ビューには JDialog の状態を表すローカル変数があります。

于 2009-02-13T11:34:03.980 に答える
1

私のアドバイスは、これらの「好み」が根本的に何であるかを考えることです。それらは基礎となるビジネス ロジックの一部ですか? もしそうなら、それらはモデル構造の一部でなければなりません。ビジネス データを操作するユーザーの好みの方法を指定していますか? 次に、それらはビューの一部である必要があります。これは理論上のように思えるかもしれませんが、私の経験では、最終的に多くの頭痛の種から解放されます。

それがうまくいかない場合は、設定が保存されている場所から別の手がかりが得られます。操作中のデータとともに保存する必要がある場合、それらはおそらくビジネス ロジックの一部です。それらがユーザーの個人設定ファイルに保存されている場合、それらは保存されておらず、ビューと見なす必要があります。

于 2009-02-06T16:23:34.507 に答える
1

いいえ、設定のためだけに別の「モデル」は必要ありません

JDialog のコンストラクターでプレゼンターとモードを引数として渡すだけです。大きな Swing アプリケーションをプログラムする方が簡単です。

  • 1 モデル
  • 1 コントローラー (それ自体に小さいコントローラーが含まれている場合があります)
  • 複数のビュー (ただし、同じデータ/モデル クラス)

1 モデル != 1 クラスであることに注意してください。Swing アプリケーションの「モデル」は、実際には、共通の「ルート」を持つ別個の「モデル」クラスの「ツリー」である場合があります。

したがって、あなたの場合は必要です

「グローバル」モデル -> (含む) 「設定」モデル。

于 2009-02-10T21:47:45.280 に答える