無論是架構還是設計模式,其目的都是為了解耦耘拇,解耦的手段即為分離關注點撵颊,而分離關注點的通用做法就是分層。分層之后惫叛,層與層之間的關系和通信則成為了架構的主要焦點倡勇,因為我們看到大多數的架構,M和V都有嘉涌,但是鏈接M和V的中間層則各不相同妻熊,遇上MVC就鹽化出了MVP,MVVM這些架構仑最。
1.什么是VMP
MVP全稱Model–View–Presenter扔役,是由MVC衍生來的一種輕量級的架構,被廣泛用于便捷化的單元測試和在呈現邏輯中改善分離關注點警医。
M:模型層亿胸,模型不僅僅指數據,還包括處理邏輯预皇〕扌基本上,所有的業(yè)務邏輯都算Model深啤,通常Model層也是最厚的一層拗馒。Model層于中間層的通信方式通常采用類似于監(jiān)聽者模式的回調機制來獲取數據的更新,這對于Android開發(fā)是很適用的溯街,因為Android的費時操作都要求在異步線程來完成诱桂。
P:接受來自視圖層的事件洋丐,從Model獲取數據,即擔當所謂的中間人挥等。Presenter的設計不要過于龐大友绝,針對一個頁面設計即可。在谷歌Demo中便有Contract的概念肝劲,定義一對View和Presenter迁客,這個Contract便是這對V-P的鏈接橋梁。
和MVC一樣辞槐,MVP也是用來分離數據和模型的掷漱。不夠過它分離的更徹底,,如圖:
在MVP中M和V不進行交互榄檬,所有的信息交流都通過一個名為Presenter的“中間人”角色卜范。
2.Google是如何用MVP的
https://github.com/googlesamples/android-architecture
Google架構藍圖從代碼結構、體系架構鹿榜、測試性海雪、可維護性設計了一系列Demo,以為我們在開發(fā)中可能遇到的問題提供參考舱殿。
todo-mvp:
這是一個基本結構的MVP范例奥裸,以下的Demo都是基于此擴展的。View沒有任何邏輯沪袭,Repository負責向本地及遠端獲取數據并通知Presenter數據更新湾宙,Presenter依然作為所謂的中間人角色,控制事件的分發(fā)和數據回調等信息交互邏輯枝恋。
todo-mvp-loader
Loader即Android的加載器创倔,它夾在Presenter和Repository之間,接管了獲取數據的工作焚碌。有了這個Loader畦攘,便能利用其異步加載和實時更新數據的特性。
mvp-databinding
https://developer.android.com/topic/libraries/data-binding/index.html#data_objects
databinding是基于數據綁定的一個實現十电,有一點類似于MVVM知押,但是也不盡相同,因為Model和ViewModel層并沒有綁定鹃骂,View和ModelView也沒有雙向綁定台盯。在這里ModelView只是接管View的更新,主要是用了databinding的數據綁定畏线,當然databinding比這強大得多静盅,你可以完全去掉Presenter,讓它轉發(fā)事件寝殴,并讓數據綁定進來蒿叠,寫一個完全的MVVM明垢。
MVVM等幾種架構:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html
mvp-clean
Clean模式國內譯為自潔模式,是谷歌大道歸一的設計思想市咽,在這個模型例痊银,程序的每一個區(qū)域用不同的同心圓來表示,外圍的圓代表機制施绎,內部的圓代表策略溯革。其依賴規(guī)則是向內依賴,即只允許外部對內部依賴谷醉,內部圓不能有任何外部圓的聲明:https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
谷歌的示例中致稀,引入clean模式后新增了一個DomainLayer,里面包含了大量的用例俱尼,用例的好處的是復用代碼并能提高代碼的可讀寫豺裆,用例包含了用戶的使用場景,容易對業(yè)務跟蹤号显。最重要的是在clean模式中用例是相當孤單的一層,要求用例和第三方框架躺酒,如Android SDK押蚤,以及業(yè)務的規(guī)則沒有任何依賴。另外再明顯不過的羹应,用例很好寫測試用例揽碘。通過這些用例,Presenter的工作被分擔出去了园匹,業(yè)務也更快清晰了雳刺。