### [**Google官方MVP**](https://github.com/googlesamples/android-architecture/tree/todo-mvp/)
- 背景:多家公司有自己的MVP架構,沒有統一的標準
- 目的
- 提供基本的[Model-View-Presenter](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter)(MVP)架構,而不使用任何架構框架
- 作為比較和對比本project中其他示例的一個參考點。
- 注意:此項目在所有存儲庫分支中使用以下命名約定來區分View類和MVP視圖:
- “Android視圖”是指android.view.View類。
- 從MVP中的演示者 presenter 接收命令的視圖被稱為“視圖”。
- 下圖為MVP官網demo中包架構圖

上圖中的包含義如下所示
- Tasks 包:可以顯示任務列表,用于管理任務列表
- TaskDetail 包:顯示任務詳情,用于讀取或刪除任務。
- AddEditTask包:添加和編輯任務,用于創建或編輯任務。
- Statistics 包:用來顯示任務的完成情況,顯示與任務相關的統計信息
- data包:數據模塊對應MVP的Model
- util包:通用的方法
- 接口BasePresenter和BaseView:是Presenter層接口和View層接口的基類,項目中所有的Presenter接口和View層接口都繼承自這兩個接口。
#### **MVP設計示例**
在這個版本的應用程序(即上述官網的MVP示例,結構如上圖所示),以及基于它的其他版本,每個屏幕screen是使用以下類和接口實現的:
- 一個定義MVP視圖(MVP中的View)和演示者(Presenter)之間的連接的契約類。
- 一個創建Fragments片段和Presenters演示者的Activity活動。
- 一個實現View Interface接口的Fragment。
- 一個在相應關聯的實現了Presenter Interface 接口的Presenter演示者。
實現APP,如下圖所示

在上面的插圖中,該版本的應用程序使用Fragment片段,這有兩個原因:
- 同時使用這兩種活動Activity和片段Fragment可以更好地分離對MVP實施的補充。在這個版本的應用程序中,活動Activity是創建和連接視圖(View)和演示者(Presenter)的整體控制器。
- 片段Fragment的使用支持具有多個視圖的平板電腦布局或UI屏幕。
這個版本的應用程序包括一些單元測試,包括演示者,存儲庫和數據源。該示例還包括依賴于假數據的UI測試,并通過依賴注入來提供假模塊。
### **個人見解**
* **View**: 對于View層也是視圖層,在**View層中只負責對數據的展示**,提供友好的界面與用戶進行交互。在**Android開發中通常將Activity或者Fragment作為View層**。
* **Model**: 對于Model層也是**數據層**。它區別于MVC架構中的Model,在這里不僅僅只是數據模型。在MVP架構中Model它**負責對數據的存取操作,例如對數據庫的讀寫,網絡的數據的請求等**。
* **Presenter**:對于Presenter層他是連接View層與Model層的橋梁并對業務邏輯進行處理。在MVP架構中Model與View無法直接進行交互。所以**在Presenter層它會從Model層獲得所需要的數據,進行一些適當的處理后交由View層進行顯示**。這樣通過Presenter將View與Model進行隔離,使得View和Model之間不存在耦合,同時也將業務邏輯從View中抽離。
**總結**:在MVP架構中**將這三層分別抽象到各自的接口**當中。**通過接口將層次之間進行隔離,而Presenter對View和Model的相互依賴也是依賴于各自的接口**。這點符合了接口隔離原則,也正是面向接口編程。在**Presenter層中包含了一個View接口,并且依賴于Model接口,從而將Model層與View層聯系在一起。而對于View層會持有一個Presenter成員變量并且只保留對Presenter接口的調用,具體業務邏輯全部交由Presenter接口實現類中處理。**
**另外,MVP只是一種思想,具體的實現思路各不相同,具體問題具體分析,應該考慮各個方面,比如是否會內存泄漏等等。**
#### [官方架構及其擴展結構](https://github.com/googlesamples/android-architecture)
- 穩定的demo

- 過時的demo(已不再維護,但是還可以使用)

- 正在開發中的demo

- 外部demo

* todo-mvp: 基礎的MVP架構。
* todo-mvp-loaders:基于MVP架構的實現,在獲取數據的部分采用了loaders架構。
* todo-mvp-databinding: 基于MVP架構的實現,采用了數據綁定組件。
* todo-mvp-clean: 基于MVP架構的clean架構的實現。
* todo-mvp-dagger2: 基于MVP架構,采用了依賴注入dagger2。
* dev-todo-mvp-contentproviders: 基于mvp-loaders架構,使用了ContenPproviders。
* dev-todo-mvp-rxjava: 基于MVP架構,對于程序的并發處理和數據層(MVP中的Model)的抽象。
從上述的介紹中可以看出,對于官方給出所有的架構的實現最終都是基于MVP架構。所以在這里就對上面的基礎的MVP架構todo-mvp進行分析。
#### **參考鏈接**:
[Android官方MVP架構解讀](http://blog.csdn.net/ljd2038/article/details/51477475)
[Android MVP開發模式 google 官方Mvp架構詳解](http://blog.csdn.net/jungle_pig/article/details/65626469)
[Android開發之MVP模式(根據google的demo的修改版) ](http://blog.csdn.net/Picasso_L/article/details/50515613)