Android开发中的MVC、MVP与MVVM详解

Android MVC、MVP、MVVM 详细讲解 + Java 完整示例

先讲核心思想、职责分层、优缺点,再分别用 Java 纯代码 写可直接运行的简单案例,方便看懂三者区别。

一、先统一认知:三层核心角色

  • View:视图层,负责页面展示、用户交互(Activity、Fragment、Xml布局)

  • Model:数据层,负责数据获取、业务逻辑、网络/本地数据库/计算逻辑

  • Presenter / ViewModel:中间调度层,解耦 View 和 Model

一、MVC 架构(传统模式)

  1. 核心思想
  • M:Model 数据&业务逻辑

  • V:View 布局视图

  • C:Controller 控制器 就是 Activity/Fragment

  • 特点:Activity 既是 View 又是 Controller,直接持有 Model,强耦合。

  1. 执行流程

View(Activity) <--> Controller(自身) <--> Model

  1. 优缺点

✅ 简单入门、代码少

❌ Activity 臃肿,业务逻辑和UI混在一起、耦合高、难单元测试、不符合单一职责

  1. 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)

  1. 核心思想
  • 拆分 View 和 Controller,抽离出 Presenter 中间人

  • View:只做UI、只暴露接口

  • Presenter:处理业务逻辑、调度 View 和 Model

  • Model:只负责数据

  • View 和 Model 完全不直接通信,全部通过 Presenter

  1. 执行流程

View <--> Presenter <--> Model

  1. 优缺点

✅ 职责分离、Activity 变轻、方便单元测试、耦合低

❌ 多了很多接口、类文件变多、模板代码繁琐

  1. 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 架构(数据驱动、双向绑定)

  1. 核心思想
  • VM = ViewModel 替代 Presenter

  • 核心:数据驱动UI,不用频繁写接口回调

  • ViewModel 持有 Model 和 数据观察者

  • View 监听 ViewModel 数据变化,自动刷新UI

  • Android 常用:LiveData + ViewModel 实现 MVVM

  1. 执行流程

View <--> ViewModel <--> Model

  1. 优缺点

✅ 不用大量定义接口、数据驱动、UI自动更新、生命周期感知、解耦更强

❌ 入门稍难、数据绑定不好调试、适合复杂项目

  1. 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 低 极少 大型项目、页面复杂、数据驱动

一句话总结

  1. MVC:Activity 包揽一切,懒人写法

  2. MVP:抽Presenter,接口隔离View和Model

  3. MVVM:用ViewModel+LiveData,数据驱动UI,告别大量接口

相关推荐
阿巴斯甜4 小时前
必看4
android
Carson带你学Android4 小时前
Android 17 最后一个 Beta 发布,7 件事必须现在做
android·ai编程
ooseabiscuit4 小时前
Laravel 9.x重磅升级:PHP8新特性全解析
android
帅次4 小时前
深入 MaterialTheme:掌握 ColorScheme 与 Typography 的设计核心
android·kotlin·gradle·android jetpack·compose
阿巴斯甜4 小时前
必看2
android
重生之小比特5 小时前
【MySQL 数据库】复合查询
android·数据库·mysql
用户86022504674725 小时前
Jetpack Activity 完整示例教程
android
simplepeng5 小时前
如何减少 89% 的重组,每个Compose开发者都需要的技巧 - derivedStateOf
android·android jetpack