android中mvc、mvp、mvvm模式区别
特性MVCMVPMVVM职责分离Activity 兼任 ControllerPresenter 处理业务逻辑ViewModel 管理数据状态耦合度高(View 和 Model 直接交互)低(通过接口解耦)低(数据绑定)测试便利性难以测试便于单元测试便于单元测试代码量较少(但易臃肿)较多(需定义接口)中等(利用 Jetpack)适用场景简单页面需要测试的中型项目复杂 UI 或数据驱动项目。
·
1. MVC 模式(Model-View-Controller)
代码结构:
// Model: 数据层
public class UserModel {
private String name;
public UserModel(String name) { this.name = name; }
public String getName() { return name; }
}
// View: XML 布局 + Activity 的部分视图逻辑
// res/layout/activity_mvc.xml
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
// Controller: Activity 承担 Controller 角色
public class MvcActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvc);
textView = findViewById(R.id.textView);
// Controller 直接操作 Model 和 View
UserModel model = new UserModel("MVC User");
updateView(model);
}
private void updateView(UserModel model) {
textView.setText(model.getName()); // 直接更新 View
}
}
MVC 特点:
-
Activity 同时承担 View 和 Controller 角色,容易导致代码臃肿。
-
Model 和 View 直接耦合,难以单元测试。
2. MVP 模式(Model-View-Presenter)
代码结构:
// Model: 数据层
public class UserModel {
private String name;
public UserModel(String name) { this.name = name; }
public String getName() { return name; }
}
// View 接口:解耦 View 逻辑
public interface UserView {
void showUserName(String name);
}
// Presenter: 业务逻辑处理
public class UserPresenter {
private UserView view;
public UserPresenter(UserView view) {
this.view = view;
}
public void loadUser() {
UserModel model = new UserModel("MVP User");
view.showUserName(model.getName()); // 通过接口更新 View
}
}
// View 实现:Activity 只负责 UI
public class MvpActivity extends AppCompatActivity implements UserView {
private TextView textView;
private UserPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);
textView = findViewById(R.id.textView);
presenter = new UserPresenter(this);
presenter.loadUser(); // 触发业务逻辑
}
@Override
public void showUserName(String name) {
textView.setText(name); // 实现 View 接口方法
}
}
MVP 特点:
-
通过接口解耦 View 和 Presenter,便于单元测试。
-
Presenter 不持有 Android 上下文,避免内存泄漏。
3. MVVM 模式(Model-View-ViewModel)
代码结构(使用 Jetpack 组件):
// Model: 数据层
public class UserModel {
private String name;
public UserModel(String name) { this.name = name; }
public String getName() { return name; }
}
// ViewModel: 管理数据暴露
public class UserViewModel extends ViewModel {
private MutableLiveData<String> userName = new MutableLiveData<>();
public LiveData<String> getUserName() {
return userName;
}
public void loadUser() {
UserModel model = new UserModel("MVVM User");
userName.setValue(model.getName()); // 更新 LiveData
}
}
// View: Activity/Fragment 观察数据
public class MvvmActivity extends AppCompatActivity {
private TextView textView;
private UserViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvvm);
textView = findViewById(R.id.textView);
viewModel = new ViewModelProvider(this).get(UserViewModel.class);
viewModel.getUserName().observe(this, name -> {
textView.setText(name); // 自动响应数据变化
});
viewModel.loadUser(); // 触发数据加载
}
}
MVVM 特点:
-
数据驱动 UI(通过
LiveData/DataBinding),实现自动更新。 -
减少手动更新 View 的代码,适合复杂 UI 交互。
关键区别总结:
| 特性 | MVC | MVP | MVVM |
|---|---|---|---|
| 职责分离 | Activity 兼任 Controller | Presenter 处理业务逻辑 | ViewModel 管理数据状态 |
| 耦合度 | 高(View 和 Model 直接交互) | 低(通过接口解耦) | 低(数据绑定) |
| 测试便利性 | 难以测试 | 便于单元测试 | 便于单元测试 |
| 代码量 | 较少(但易臃肿) | 较多(需定义接口) | 中等(利用 Jetpack) |
| 适用场景 | 简单页面 | 需要测试的中型项目 | 复杂 UI 或数据驱动项目 |
补充说明:
-
MVC 在 Android 中通常表现为 Activity/Fragment 同时承担 View 和 Controller 角色。
-
MVP 通过接口隔离,使得 Presenter 可以脱离 Android 环境测试。
-
MVVM 结合
LiveData和DataBinding实现声明式 UI,是 Google 官方推荐模式。
更多推荐



所有评论(0)