MVC
- mvc 定義
model view controler 模型 視圖 控制器 ,是一種軟件的設(shè)計典范, 業(yè)務(wù)邏輯,數(shù)據(jù),界面顯示分離的 方法 組織代碼,然后可以將業(yè)務(wù)邏輯 聚集到一塊。
1.M: 業(yè)務(wù)邏輯處理
2.V: 處理數(shù)據(jù)顯示的部分
3.C: Activity 處理用戶交互問題
mvc 便于 UI 界面的顯示 和業(yè)務(wù)邏輯的分離。
MVC的特點(diǎn):耦合性低,可擴(kuò)展性好
Activity 是 controler 起到 橋梁的作用,通過接口通信/
數(shù)據(jù)model 里拿數(shù)據(jù), 比如 model 里面 getdata() , getdata() 方法里面網(wǎng)絡(luò)請求等成功之后,又 根據(jù)不同的 情況走某個接口,該接口 走到 act 中
而這個model 里面也是 implement 了一個接口,除了getdata(),可以加入更多的 getX().
MVP
對于MVC呢
由于Android 端 的 view 層 是xml布局文件,不像在 java web 那樣,view 層功能的強(qiáng)大,能做的事情非常有限,
而 controler 對應(yīng)的 activity,而activity 又不得不操作一些view,而這些 操作本該是view 層做的事情,所以 controler 層顯得非常冗余,為改善這一點(diǎn)提出了 MVP.
M : 依然是業(yè)務(wù)邏輯和實(shí)體模型
V :對應(yīng)于Activity,負(fù)責(zé) View 的繪制以及用戶的交互
P :負(fù)責(zé) 完成 View 與 Model 間的交互

如圖就是 在MVP 中,model 層不會直接與 View 層交互, 而是通過Presenter 中介進(jìn)行交互,也正因?yàn)?android中,view層很重要,只能在主線程中操作UI,經(jīng)常是不可以做耗時操作什么的,mvp 把 view 層跟數(shù)據(jù)層切斷 是非常非常合理的。從代碼上一開始的定位就 是對性能好一點(diǎn)。
例子:
/bean/ 目錄下 User ,代表model 層
/presenter/ 目錄下 UserLoginPresenter ,代表presenter 層
/view/ 目錄下 識圖層 ,view 層 IUserLoginView
腦袋里開始過這樣的設(shè)計。
User.java 就是一些 username,password 的 get(), set()
然后實(shí)現(xiàn)一個接口,
public interface IUserBiz {
void login(String username , String password ,OnLoginListener listener);
}
以及他的實(shí)現(xiàn)方法:
UserBiz implement IUserBiz {
@Override
public void login ( String usrename ,String password, OnLoginListener listener){
}
}
然后就是view 層,對應(yīng)activity ,實(shí)現(xiàn)也是一個接口,
public interfac IUserLoginView{
String getUserName():
String getPassWord();
void clearUserName();
void clearPassword();
void showLoading();
void hideLoading();
void showError();
}
Activity 中 implement 這個接口
在act 中聲明一個 presenter
然后就是 presenter:
public class UserLoginPresenter {
public UserLoginPresenter(IUserLoginView userloginView){
this.userLoginView = userLoginView;
this.userBiz = new UserBiz();
}
public void login() {
//通過userBIz.login( userloginView.getUserName() ----- 等等)
}
}
MVVM

MVVM 其實(shí)跟 MVP 很類似的,主要是用數(shù)據(jù)綁定跟依賴 打造一個更高效的架構(gòu)。
1:View:對應(yīng)與 Activity 和XML,負(fù)責(zé)View 的繪制以及與用戶交互, 做的其實(shí)就是UI相關(guān)的工作,view 層不做和業(yè)務(wù)相關(guān)的事,更新UI 也通過數(shù)據(jù)綁定來完成,業(yè)務(wù)盡量在viewmodel 層去做,把Activity 中的業(yè)務(wù)邏輯 移到viewmodel 層去 做,而Activity 要做的事就是 去初始化控件啊,屬性之類的,而View 層提供更新UI的接口,但是不提倡把所有的 UI元素 都通過數(shù)據(jù)綁定來更新UI,View 層還可以做綁定事件等等。負(fù)責(zé)繪制UI,和用戶操作,但是不處理業(yè)務(wù)。 最重要的一點(diǎn)就是View 層不做任何與業(yè)務(wù)邏輯有關(guān)的操作
2:Model : 實(shí)體模型 除了數(shù)據(jù)bean,還提供接口 供 第三個層,viewmodel 層用。數(shù)據(jù)的存儲,獲取,變化,都由他完成。
3: ViewModel :負(fù)責(zé)完成View 與model 間的交互,負(fù)責(zé)業(yè)務(wù)邏輯。他不會持有任何控件的引用,持有引用的任務(wù) 都挪在view 層區(qū)完成了,這就不不像MVP 中的 presenter 需要一個view 的引用接口的。
ViewModel 層 和View 層的交互是通過DataBInding 做的。
總結(jié)
mvc -- controler 層 的 act ,view 的 xml 太弱了,一大部分操作其實(shí) 都由 act 完成,所以 c 太 冗余了
mvp --- view -->actvity , 讓 presenter 層做業(yè)務(wù)邏輯,presenter 持有的是view 的接口,操作接口,而不是直接操作view,這樣就把識圖操作和 業(yè)務(wù)邏輯解耦,從而讓 activity 成為真正的view 層
mvvm -- view 層, viewmodel 層,model 層, view 層不能做任何業(yè)務(wù)操作, 而 viewmodel 層卻只能做 業(yè)務(wù)操作。