Android MVC、MVP、MVVM 详细讲解 + Java 完整示例
先讲核心思想、职责分层、优缺点,再分别用 Java 纯代码 写可直接运行的简单案例,方便看懂三者区别。
一、先统一认知:三层核心角色
-
View:视图层,负责页面展示、用户交互(Activity、Fragment、Xml布局)
-
Model:数据层,负责数据获取、业务逻辑、网络/本地数据库/计算逻辑
-
Presenter / ViewModel:中间调度层,解耦 View 和 Model
一、MVC 架构(传统模式)
- 核心思想
-
M:Model 数据&业务逻辑
-
V:View 布局视图
-
C:Controller 控制器 就是 Activity/Fragment
-
特点:Activity 既是 View 又是 Controller,直接持有 Model,强耦合。
- 执行流程
View(Activity) <--> Controller(自身) <--> Model
- 优缺点
✅ 简单入门、代码少
❌ Activity 臃肿,业务逻辑和UI混在一起、耦合高、难单元测试、不符合单一职责
- Java 代码示例(MVC)
1)Model 层(数据&业务)
java
// UserModel.java
public class UserModel {
// 模拟获取用户信息(耗时操作/网络请求)
public void getUserInfo(OnUserListener listener){
// 模拟网络延迟
new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 回调结果
listener.onSuccess("张三", 20);
}).start();
}
// 回调接口
public interface OnUserListener{
void onSuccess(String name, int age);
}
}
2)View + Controller(Activity)
java
// MvcActivity.java
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MvcActivity extends AppCompatActivity {
private TextView tvUser;
private UserModel userModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvc);
tvUser = findViewById(R.id.tv_user);
userModel = new UserModel();
// 直接调用Model
loadUser();
}
private void loadUser(){
userModel.getUserInfo((name, age) -> {
// 子线程切主线程更新UI
runOnUiThread(() ->
tvUser.setText("姓名:" + name + ",年龄:" + age)
);
});
}
}
问题:Activity 里塞满业务逻辑、网络逻辑,页面复杂后巨难维护。
二、MVP 架构(解耦 View 与 Model)
- 核心思想
-
拆分 View 和 Controller,抽离出 Presenter 中间人
-
View:只做UI、只暴露接口
-
Presenter:处理业务逻辑、调度 View 和 Model
-
Model:只负责数据
-
View 和 Model 完全不直接通信,全部通过 Presenter
- 执行流程
View <--> Presenter <--> Model
- 优缺点
✅ 职责分离、Activity 变轻、方便单元测试、耦合低
❌ 多了很多接口、类文件变多、模板代码繁琐
- Java 代码示例(MVP)
1)Model 层(和MVC一样,复用)
java
public class UserModel {
public void getUserInfo(OnUserListener listener){
new Thread(() -> {
try { Thread.sleep(1000); } catch (Exception e) {}
listener.onSuccess("李四", 22);
}).start();
}
public interface OnUserListener{
void onSuccess(String name, int age);
}
}
2)View 接口(抽象页面能力)
java
// IUserView.java
public interface IUserView {
// 展示用户信息
void showUser(String name, int age);
}
3)Presenter 中间层
java
// UserPresenter.java
public class UserPresenter {
private IUserView mView;
private UserModel mModel;
// 绑定View
public UserPresenter(IUserView view){
this.mView = view;
this.mModel = new UserModel();
}
// 业务逻辑:加载用户
public void loadUser(){
mModel.getUserInfo((name, age) -> {
// 回调给View
mView.showUser(name, age);
});
}
}
4)Activity 实现 View 接口
java
// MvpActivity.java
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MvpActivity extends AppCompatActivity implements IUserView {
private TextView tvUser;
private UserPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);
tvUser = findViewById(R.id.tv_user);
// 绑定Presenter
presenter = new UserPresenter(this);
presenter.loadUser();
}
// 实现View接口方法,只做UI更新
@Override
public void showUser(String name, int age) {
runOnUiThread(() ->
tvUser.setText("MVP姓名:" + name + ",年龄:" + age)
);
}
}
优势:Activity 只剩UI,业务全在Presenter,随时替换View。
三、MVVM 架构(数据驱动、双向绑定)
- 核心思想
-
VM = ViewModel 替代 Presenter
-
核心:数据驱动UI,不用频繁写接口回调
-
ViewModel 持有 Model 和 数据观察者
-
View 监听 ViewModel 数据变化,自动刷新UI
-
Android 常用:LiveData + ViewModel 实现 MVVM
- 执行流程
View <--> ViewModel <--> Model
- 优缺点
✅ 不用大量定义接口、数据驱动、UI自动更新、生命周期感知、解耦更强
❌ 入门稍难、数据绑定不好调试、适合复杂项目
- Java 代码示例(MVVM 原生 LiveData 版)
依赖(build.gradle)
gradle
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
implementation 'androidx.lifecycle:lifecycle-livedata:2.5.1'
1)Model 层(依旧复用)
java
public class UserModel {
public void getUserInfo(OnUserListener listener){
new Thread(() -> {
try { Thread.sleep(1000); } catch (Exception e) {}
listener.onSuccess("王五", 25);
}).start();
}
public interface OnUserListener{
void onSuccess(String name, int age);
}
}
2)ViewModel 层(核心)
java
// UserViewModel.java
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class UserViewModel extends ViewModel {
// 可观察数据
public MutableLiveData<String> userName = new MutableLiveData<>();
public MutableLiveData<Integer> userAge = new MutableLiveData<>();
private UserModel userModel = new UserModel();
// 加载数据
public void loadUser(){
userModel.getUserInfo((name, age) -> {
// 给LiveData设值,View自动观察更新
userName.postValue(name);
userAge.postValue(age);
});
}
}
3)Activity 层(只观察数据、更新UI)
java
// MvvmActivity.java
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
public class MvvmActivity extends AppCompatActivity {
private TextView tvUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvvm);
tvUser = findViewById(R.id.tv_user);
// 获取ViewModel
UserViewModel viewModel = new ViewModelProvider(this).get(UserViewModel.class);
// 观察数据变化,自动更新UI
viewModel.userName.observe(this, name -> updateUI(name, viewModel.userAge.getValue()));
viewModel.userAge.observe(this, age -> updateUI(viewModel.userName.getValue(), age));
// 触发加载
viewModel.loadUser();
}
private void updateUI(String name, Integer age){
if(name != null && age != null){
tvUser.setText("MVVM姓名:" + name + ",年龄:" + age);
}
}
}
特点:没有任何接口定义,View 只订阅数据,数据变UI自动变。
四、三者核心区别总结
架构 控制器 耦合度 接口数量 适用场景
MVC Activity 高 少 简单小项目、快速开发
MVP Presenter 中低 多 中大型项目、需要分层解耦
MVVM ViewModel 低 极少 大型项目、页面复杂、数据驱动
一句话总结
-
MVC:Activity 包揽一切,懒人写法
-
MVP:抽Presenter,接口隔离View和Model
-
MVVM:用ViewModel+LiveData,数据驱动UI,告别大量接口