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,告别大量接口

相关推荐
爱笑鱼1 小时前
Binder(八):远端进程死了,BinderProxy 为什么还能收到通知?
android
zhangphil1 小时前
Android ContentProvider/ContentResolver读图片,跨进程 IPC慢
android
yueqc12 小时前
Android .so 文件压缩
android·so·包体积
龚礼鹏2 小时前
深入解析 Android Automotive (AAOS) 启动流程与 CarService 核心机制(基于 Android 16 最新源码视角)
android
rosmis2 小时前
agent各指标定义
android·java·开发语言
风样滴男人哟3 小时前
PHP特性之反射类ReflectionClass机制
android·开发语言·php
小孔龙4 小时前
RenderNode 与 DisplayList:Android 硬件加速的绘制记录与复用
android·性能优化
qizayaoshuap5 小时前
鸿蒙 ArkTS 实战:搜索列表 城市实时过滤(示例 94)
android·华为·harmonyos
朝星5 小时前
Framework筑基之Handler消息机制5(应用层)
android
2601_965798475 小时前
ForumLab Review: Fast PHP Script for SEO Forum Sites
android·adb·php