在Android中,業(yè)務邏輯和數(shù)據(jù)存取是緊緊耦合的,很多缺乏經(jīng)驗的開發(fā)者很可能會將各種各樣的業(yè)務邏輯塞進某個Activity、Fragment或者自定義View中,這樣會使得這些組件的單個類型臃腫不堪。如果不將具體的業(yè)務邏輯抽離出來,當UI變化時,你就需要去原來的View中抽離具體業(yè)務邏輯,這必然會很麻煩并且易出錯。
MVC
MVC,全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業(yè)務邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務邏輯。MVC被獨特的發(fā)展起來用于映射傳統(tǒng)的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結(jié)構中。
M:Model,數(shù)據(jù)層,主要是用來做獲取數(shù)據(jù),存儲數(shù)據(jù)等業(yè)務邏輯的
V:View,視圖層,用來顯示Model層數(shù)據(jù)的
C:Controller:控制層,用來控制顯示視圖和處理接收MV傳遞過來的數(shù)據(jù)的
下面我們來用Android代碼來寫一個很簡單的例子,獲取數(shù)據(jù)并顯示一個列表!在Android里面,視圖層,MVC結(jié)構里面,相當于布局,而控制器自然就是Actvity了!好,我們來寫代碼:我在下面寫了一個動態(tài)加載的RecyclerView
那么怎么獲取數(shù)據(jù),我們這里使用靜態(tài)數(shù)據(jù)來獲取。。。寫一個Model接口里面包含著獲取數(shù)據(jù)的操作,另外聲明一個監(jiān)聽器負責獲得數(shù)據(jù)后的操作
然后寫Model層數(shù)據(jù)實現(xiàn)這個接口
我們獲取數(shù)據(jù)的流程寫出來了,那么我們總是要用的吧,下面我們就繼續(xù)寫Activity,就是我們Controller的代碼
好的,其實MVC就這樣,把業(yè)務邏輯層和視圖顯示給分開來處理,調(diào)用的話,直接更改DataModel里面的邏輯就可以了,是不是很簡單!
MVP
(1)Presenter – 交互中間人:Presenter主要作為溝通View與Model的橋梁,它從Model層檢索數(shù)據(jù)后,返回給View層,使得View與Model之間沒有耦合,也將業(yè)務邏輯從View角色上抽離出來。
(2)View – 用戶界面:View通常是指Activity、Fragment或者某個View控件,它含有一個Presenter成員變量。通常View需要實現(xiàn)一個邏輯接口,將View上的操作轉(zhuǎn)交給Presenter進行實現(xiàn),最后,Presenter 調(diào)用View邏輯接口將結(jié)果返回給View元素。
(3)Model – 數(shù)據(jù)的存?。篗odel 角色主要是提供數(shù)據(jù)的存取功能。Presenter 需要通過Model層存儲、獲取數(shù)據(jù),Model就像一個數(shù)據(jù)倉庫。更直白的說,Model是封裝了數(shù)據(jù)庫DAO或者網(wǎng)絡獲取數(shù)據(jù)的角色,或者兩種數(shù)據(jù)方式獲取的集合。
那么我們要怎么寫呢,還是之前Android的例子!
我們聲明個Contract類,里面包含著三個接口,分別是View,Presenter,和Model!
然后我們需要寫獲取數(shù)據(jù)邏輯是吧嗯,沒錯,那就繼承Model類,因為我們Model和View交互還需要中介者,所以這個類需要持有Presenter對象
下面我們需要寫一下中介者需要做啥,View通過Presenter來向Model獲取數(shù)據(jù)是吧,所以要loaddata,Model獲取完數(shù)據(jù)后是不是要給回View啊,那Model就需要調(diào)用onLoadDataSuccess()和Presenter說我拿到數(shù)據(jù)了!Presenter要怎么告訴View,所以Presenter需要持有View對象和Model對象
那么我們已經(jīng)把數(shù)據(jù)和流程給理清楚了,下面就是寫Activity的劇情了!和MVC一樣。。。不過,有沒有發(fā)現(xiàn),不需要寫監(jiān)聽函數(shù)了
區(qū)別
從上圖可以看出:MVC的耦合性還是較高的,View可以直接訪問Model,導致3者之間構成了回路。所以兩者的主要區(qū)別是,MVP中View不能直接訪問Model,需要通過Presenter發(fā)出請求,View與Model不能直接通信。
MVVM與MVP非常相似,唯一區(qū)別是View和Model進行雙向綁定,兩者之間有一方發(fā)生變化則會反應到另一方上。MVVM模式有點像ListView與Adapter、數(shù)據(jù)集的關系,當數(shù)據(jù)集發(fā)生變化時,調(diào)用Adapter的notifyDataSetChanged之后View就直接更新,同時它們之間又沒有耦合,使得ListView變得更加靈活。