web-dev-qa-db-ja.com

プレゼンターまたはビューは、MVPパターンのモデルとどのように相互作用しますか?

MV *パターンを学習しています。この場合のMVP。古いAndroidアプリケーションをMVPパターンにリファクタリングして、物事の結合を弱めようとしていますが、1つの概念に苦労しています。プレゼンターがドメインレイヤーからデータを取得することはわかっています。これはデータレイヤーを介して接続しますが、ビューはどのようにして直接的または間接的にデータと通信できますか?これが私が理解しようとしている例です:

UIでのユーザーの操作に応じて開始または停止する必要がある、長時間実行されるダウンロードサービスがあります(これはデータレイヤーにあるはずです)。これらの信号をデータ層のサービスにどのように伝達しますか?ドメインレイヤーでそれを行う必要がありますか?

私が見たところ、UIはデータまたはドメインレイヤーに応答できないようです。

誰かが私にこれを説明してくれるなら、私はとても感謝しています。

ここに私が取り組んでいる記事のいくつかがあります: 最初のリソース | 2番目のリソース | 番目のリソース

6
AlexW.H.B.

MVPパターンでは、ビューは「ダム」です。実際には何もしません。プレゼンターは階層内の制御オブジェクトとして機能し、モデルはデータを格納し、ビジネスロジックメソッドを持ちます。

これは、Presenterによってモデルのメソッドやプロパティ、またはPresenter自体の他のテスト可能なロジックにフックされるイベントの発生からビューを排除するものではありません。

プレゼンターはモデルとビューの両方にアクセスできます。したがって、プレゼンターでは、ビューで発生したイベントをモデルのメソッドまたはプロパティにフックできます。ビューとモデルは、お互いについて何も知りません。

7
Stephen

パッシブビュー および スーパーバイザーコントローラー の両方のMVPフレーバーで、プレゼンターは入力ロジックと他の複雑なビューロジックを処理します。したがって、ダウンロード制御ロジックは必ずプレゼンターに入る必要があります。

典型的なJava設定(Androidは同様です)と想定しています)では、ウィジェットにイベントハンドラーを登録できます。したがって、ビューから2つの方法でプレゼンター:

  1. プレゼンターは、自身をイベントハンドラーとしてウィジェットに登録します。これには、プレゼンターからウィジェットへの直接アクセス(疎結合にはあまり適していません)またはビューのパブリックメソッドが必要です。これは少し面倒だと思います。

  2. ビュークラス内で匿名イベントハンドラーを登録し、プレゼンターメソッドを呼び出してイベントをさらに処理します。これは私の好みの方法です。いくつかの擬似コード:

    downloadStopButton.addSelectionHandler(new Selectionhandler() {
        handleEvent(Event e) {
            presenter.downloadStopCalled();
        }
    });
    

どちらの場合も、発表者はモデルまたはサービスレイヤーにダウンロードを停止するように指示します。モデルのダウンロードに関連する状態があり、モデルがサービスについて知っている場合は、モデルを調べることができます。それ以外の場合は、プレゼンターからサービスを呼び出すだけでも大丈夫だと思います。

3
jhyot