一、MVC (Model-View-Controller)数据流向User → View(点击) → Controller(Activity) → Model(数据/网络) → 回调更新 View职责划分角色职责Model数据层Bean、网络请求、数据库ViewXML Activity显示 交互监听ControllerActivity业务逻辑 UI 更新实现// ModelpublicclassUserModel{publicvoidlogin(Stringname,Stringpwd,Callbackcallback){api.login(name,pwd,callback);}}// Activity Controller ViewpublicclassLoginActivityextendsActivity{privateUserModelmodel;privateEditTextetName,etPwd;privateButtonbtnLogin;privateTextViewtvResult;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.login);modelnewUserModel();btnLogin.setOnClickListener(v-{// Controller 处理逻辑model.login(etName.getText().toString(),etPwd.getText().toString(),newCallback(){OverridepublicvoidonSuccess(Useruser){// Controller 直接更新 ViewtvResult.setText(Success);startActivity(newIntent(LoginActivity.this,MainActivity.class));}OverridepublicvoidonError(Stringmsg){tvResult.setText(msg);}});});}}✅ 优点❌ 缺点简单直观容易理解Activity 既当 C 又当 V适合小型项目代码臃肿难以维护职责分离初步体现View 和 Controller 耦合单元测试困难Model 直接操作 View推荐度⭐二、MVP (Model-View-Presenter)数据流向User → View(点击) → Presenter(中介) → Model(数据) → 回调 → Presenter → View 更新职责划分角色职责Model数据层网络、数据库、BeanViewActivity/Fragment纯 UI 展示 事件上报Presenter业务逻辑层处理逻辑 调度 M/V核心改进View 和 Presenter 通过接口解耦Presenter 可独立测试。实现// Contract 接口定义publicinterfaceLoginContract{interfaceView{voidshowLoading();voidhideLoading();voidshowError(Stringmsg);voidnavigateToMain();}interfacePresenter{voidlogin(Stringname,Stringpwd);voiddetachView();}}// Presenter 实现publicclassLoginPresenterimplementsLoginContract.Presenter{privateLoginContract.Viewview;privateLoginRepositoryrepo;publicvoidattachView(LoginContract.Viewview){this.viewview;}Overridepublicvoidlogin(Stringname,Stringpwd){if(viewnull)return;view.showLoading();repo.login(name,pwd,newCallback(){OverridepublicvoidonSuccess(){if(view!null){view.hideLoading();view.navigateToMain();}}OverridepublicvoidonError(Stringmsg){if(view!null){view.hideLoading();view.showError(msg);}}});}OverridepublicvoiddetachView(){this.viewnull;// 防止内存泄漏}}// Activity 实现 View 接口publicclassLoginActivityextendsAppCompatActivityimplementsLoginContract.View{privateLoginPresenterpresenter;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.login);presenternewLoginPresenter(newLoginRepository());presenter.attachView(this);btnLogin.setOnClickListener(v-{presenter.login(etName.getText().toString(),etPwd.getText().toString());});}OverrideprotectedvoidonDestroy(){super.onDestroy();presenter.detachView();// 必须解绑防内存泄漏}OverridepublicvoidshowLoading(){progressBar.setVisibility(View.VISIBLE);}OverridepublicvoidhideLoading(){progressBar.setVisibility(View.GONE);}OverridepublicvoidshowError(Stringmsg){Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();}OverridepublicvoidnavigateToMain(){startActivity(newIntent(this,MainActivity.class));}}✅ 优点❌ 缺点View 和 Presenter 解耦接口爆炸IView/IPresenterPresenter 可独立测试Presenter 持有 View 引用职责清晰代码分层需手动管理生命周期支持多 View 复用 P内存泄漏风险未 detach代码量增加推荐度⭐⭐三、MVVM (Model-View-ViewModel) ⭐⭐⭐⭐⭐数据流向User → View(点击) → ViewModel(业务) → Model(数据) → 数据变化 → ViewModel → View 自动更新(LiveData/Flow/DataBinding)职责划分角色职责Model数据层Repository 网络 数据库ViewActivity/Fragment纯 UI 观察数据变化ViewModel业务逻辑处理数据 暴露 LiveData核心改进数据驱动生命周期自动管理无需手动 detach。实现// ViewModelpublicclassLoginViewModelextendsViewModel{privateMutableLiveDataUiStateuiStatenewMutableLiveData();privateLoginRepositoryrepo;publicLoginViewModel(LoginRepositoryrepo){this.reporepo;}publicLiveDataUiStategetUiState(){returnuiState;}publicvoidlogin(Stringname,Stringpwd){uiState.setValue(UiState.loading());repo.login(name,pwd,newCallback(){OverridepublicvoidonSuccess(){uiState.setValue(UiState.success());}OverridepublicvoidonError(Stringmsg){uiState.setValue(UiState.error(msg));}});}}// Activity 观察数据publicclassLoginActivityextendsAppCompatActivity{privateLoginViewModelvm;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.login);vmnewViewModelProvider(this,newLoginViewModelFactory(newLoginRepository())).get(LoginViewModel.class);// 自动观察数据变化vm.getUiState().observe(this,state-{if(state.isLoading()){showLoading();}elseif(state.isSuccess()){navigateToMain();}elseif(state.isError()){showError(state.getMsg());}});btnLogin.setOnClickListener(v-{vm.login(etName.getText().toString(),etPwd.getText().toString());});}}✅ 优点❌ 缺点生命周期自动管理ViewModel 可能过重数据驱动自动更新DataBinding 调试困难ViewModel 可复用学习成本较高单元测试方便简单场景过度设计Jetpack 原生支持无需手动 detach推荐度⭐⭐⭐⭐⭐四、MVI (Model-View-Intent)数据流向User → Intent(意图) → ViewModel 处理 → Model(Reducer) → 不可变 State → View渲染新 State职责划分角色职责Intent用户意图Click/Refresh/LoadMoreViewModel处理 Intent调用 Model生成新 StateState不可变状态UI 完整快照View纯渲染函数State → UI 映射核心改进单向数据流不可变 State状态可预测支持时间旅行调试。实现// 不可变 StatepublicclassLoginState{publicfinalbooleanisLoading;publicfinalStringerror;publicfinalUseruser;publicfinalbooleanisLoggedIn;publicLoginState(booleanisLoading,Stringerror,Useruser,booleanisLoggedIn){this.isLoadingisLoading;this.errorerror;this.useruser;this.isLoggedInisLoggedIn;}// 工厂方法生成新状态publicstaticLoginStateidle(){returnnewLoginState(false,null,null,false);}publicstaticLoginStateloading(){returnnewLoginState(true,null,null,false);}publicstaticLoginStatesuccess(Useruser){returnnewLoginState(false,null,user,true);}publicstaticLoginStateerror(Stringmsg){returnnewLoginState(false,msg,null,false);}}// Intent 枚举publicenumLoginIntent{LOGIN_CLICK,USERNAME_CHANGED,PASSWORD_CHANGED}// ViewModelpublicclassLoginViewModelextendsViewModel{privateMutableLiveDataLoginStatestatenewMutableLiveData(LoginState.idle());privateLoginRepositoryrepo;publicLiveDataLoginStategetState(){returnstate;}publicvoidprocessIntent(LoginIntentintent,String...params){switch(intent){caseLOGIN_CLICK:handleLogin(params[0],params[1]);break;caseUSERNAME_CHANGED:// 处理用户名变化break;casePASSWORD_CHANGED:// 处理密码变化break;}}privatevoidhandleLogin(Stringname,Stringpwd){state.setValue(LoginState.loading());repo.login(name,pwd,newCallback(){OverridepublicvoidonSuccess(Useruser){state.setValue(LoginState.success(user));}OverridepublicvoidonError(Stringmsg){state.setValue(LoginState.error(msg));}});}}// ActivitypublicclassLoginActivityextendsAppCompatActivity{privateLoginViewModelvm;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.login);vmnewViewModelProvider(this).get(LoginViewModel.class);vm.getState().observe(this,state-{render(state);// 纯渲染函数});btnLogin.setOnClickListener(v-{vm.processIntent(LoginIntent.LOGIN_CLICK,etName.getText().toString(),etPwd.getText().toString());});}privatevoidrender(LoginStatestate){progressBar.setVisibility(state.isLoading?View.VISIBLE:View.GONE);if(state.error!null){tvError.setText(state.error);tvError.setVisibility(View.VISIBLE);}else{tvError.setVisibility(View.GONE);}if(state.isLoggedIn){startActivity(newIntent(this,MainActivity.class));}}}✅ 优点❌ 缺点单向数据流状态可预测样板代码多不可变 State调试友好State 类膨胀时间旅行调试简单场景过度设计状态复现简单学习曲线陡峭适合复杂交互场景每个 Intent 都需定义推荐度⭐⭐⭐⭐五、四大架构模式对比总结维度MVCMVPMVVMMVI数据流向双向双向双向/响应式单向View 更新Controller 直接操作Presenter 回调LiveData 自动State 不可变渲染生命周期手动管理手动 detach自动管理自动管理单元测试困难较容易容易容易代码量少多接口中等多State/Intent内存泄漏高中需 detach低低适用场景小型 Demo中小型项目中大型项目复杂交互/状态多推荐度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐六、选型建议新项目首选 MVVMJetpack 原生支持生态成熟状态复杂/团队协作选 MVI状态可预测调试友好遗留项目维护用 MVP逐步迁移避免 MVCActivity 臃肿难以维护