[Adroid]アーキテクチャモード(Architecture Pattern)、MVP?


理解するアーキテクチャモード(Architecture Pattern)、MVC
詳細については、上記の記事を参照してください.)

MVPモード


Model, View, Presenter
ビューとモデルの結合度が高いMVCモードの問題を補うために作成
表示とモデルはデモンストレーターのみ
  • Model-プログラム内に書き込まれたデータを格納および処理する役割(ビジネスロジック)
    -独立領域
  • 、ViewやPresenterなどの他の要素に依存しない
  • View-ユーザーインタフェース(Activity、Fragmentなど)
    -Presenterでモデルで処理されたデータを受信してユーザーに表示する
    -ユーザーのアクションとアクティブライフサイクルのステータスの変更を監視し、デモンストレーションに送信します.
    -デモンストレーターを使用してデータを交換するため、デモンストレーター
  • に非常に依存する.
  • Presenter-モデルとビュー間のメディア
    -VCのコントローラは直接ビューに接続され、モデル-ビューのメディアとして機能します.
    MVPのデモンストレーション者がインタフェースを介して対話する

  • ユーザの動作順序
    1.View:ユーザーイベント発生
    2.View->デモンストレーター:ユーザーイベントの転送
    3.Presenter->モデル:要求データ
    4.モデル->デモンストレーター:転送要求のデータ
    5.デモンストレーター:モデルからデータを抽出する
    6.プレゼンテーション->ビュー:制限されたデータの転送
    7.View:デモンストレーションによって送信されたデータを表示する

    アンドロイドのMVPは?

  • BasePresenter
  • interface BasePresenter<T> {
      fun takeView(view : T) // View가 생성(bind) 될 때 Presenter에 전달
      fun dropView() // View가 제거(unBind) 될 때 Presenter에 전달
    }
  • Contract
    ViewとPresenterを接続するためのインタフェースファイル
  • interface Contract {
      interface View {
    	fun A() // 값을 보여줄 View 메소드 선언
      }
      interface Presenter: BasePresenter<View> {
    	fun B() // 값을 구하기 위한 메소드 선언
      }
    }
  • Presenter
  • モデルとビューを接続して動作を処理
    class MainPresenter : Contract.Presenter {
      private var mainView : Contract.View? = null
      
      // View와 Presenter 연결
      override fun takeView(view: Contract.View) { 
    	mainView = view
      }
    
      override fun B() {
    
      }
      
      // View가 제거된 것을 Presenter에 알려줌
      override fun dropView() { 
    	mainView = null
      }
    }
  • Activity
  • class MainActivity : AppCompatActivity(). Contract.View {
      private lateinit var mainPresenter : MainPresenter
    
      override fun onCreate() {
    	initPresenter()
    	mainPresenter.takeView(this)
    	onClickBtn()
      }
    
      override fun onDestroy() {
    	mainPresenter.dropView()
      }
    
      override fun initPresenter() {
    	mainPresenter = MainPresenter()
      }
    
      private fun onClickBtn() {
    	btn.setOnClickListener {
    	    mainPresenter.B()
    	}
      }
    }

    MVPモードのパッケージング例


    📂com.example.MVP
    ┣ 📂db
    ┣ 📂network
    ┣ 📂presenter
    ┃ ┣ 📂BasePresenter
    ┃ ┣ 📂Contract
    ┣ 📂ui
    ┃ ┣ 📂main
    ┃ ┣ 📂search
    ┃ ┣ 📂review
    ┗ 📂utils
  • 型番:DB, API, SharedPreference, ~~Model(Data)
    データファイルとデータ処理ロジック
  • ビュー:Activity, Fragment, .xmlなどのUIロジック
  • プレゼンテーション:contract, presenterなどのインタフェースと処理ロジック
  • MVPモードのメリットとデメリット


    長所
    -MVCよりも明確なコード
    -モデルとビューの結合度を低下させることで拡張性を向上
    -テストコードの作成が容易
    短所
    -アプリケーションが複雑であるほど、ビューとデモンストレーションの依存性が高くなります.
    Example
    MovieReview Example with Naver API - hyooosong github
    Reference
    MVP + kotlin Example
    Androidアーキテクチャモード-MPPとは何ですか?