深入剖析Android分层架构:MVC、MVVM、MVP、MVI的区别

148 阅读3分钟

在Android开发领域,随着应用程序的规模和复杂度不断增加,选择合适的软件架构模式变得至关重要。分层架构模式能够帮助开发者更好地组织代码,提高代码的可维护性、可扩展性和可测试性。MVC、MVVM、MVP和MVI是Android开发中常见的几种分层架构模式,它们各自有着独特的设计理念和适用场景。本文将深入探讨这几种架构模式之间的区别。

MVC架构模式

组件与其他组件关系数据流向示意
Model与数据库或网络交互获取/存储数据,为Controller提供数据Model → Controller
View从Model获取数据展示,接收用户操作传递给ControllerView → Controller;Model → View
Controller接收View操作,调用Model方法,更新ViewController → Model;Controller → View
伪代码示例
// Model
class LoginModel {
    boolean validateCredentials(String username, String password) {
        // 这里进行实际的用户名和密码验证逻辑,例如查询数据库
        return "admin".equals(username) && "password".equals(password);
    }
}
// View
class LoginView {
    private LoginController controller;
    void setController(LoginController controller) {
        this.controller = controller;
    }
    void showLoginSuccess() {
        // 显示登录成功的界面
        System.out.println("登录成功");
    }
    void showLoginFailure() {
        // 显示登录失败的界面
        System.out.println("登录失败");
    }
}
// Controller
class LoginController {
    private LoginModel model;
    private LoginView view;
    LoginController(LoginModel model, LoginView view) {
        this.model = model;
        this.view = view;
    }
    void onLoginButtonClicked(String username, String password) {
        boolean isValid = model.validateCredentials(username, password);
        if (isValid) {
            view.showLoginSuccess();
        } else {
            view.showLoginFailure();
        }
    }
}

MVVM架构模式

组件与其他组件关系数据流向示意
Model处理数据和业务逻辑,为ViewModel提供数据Model → ViewModel
View通过双向数据绑定与ViewModel交互View ⇄ ViewModel
ViewModel为View提供数据,处理View交互逻辑ViewModel ⇄ View;Model → ViewModel
伪代码示例
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
// Model
class LoginModel {
    boolean validateCredentials(String username, String password) {
        return "admin".equals(username) && "password".equals(password);
    }
}
// ViewModel
class LoginViewModel extends ViewModel {
    private LoginModel model;
    private MutableLiveData<Boolean> loginResult = new MutableLiveData<>();
    LoginViewModel() {
        model = new LoginModel();
    }
    void login(String username, String password) {
        boolean isValid = model.validateCredentials(username, password);
        loginResult.setValue(isValid);
    }
    MutableLiveData<Boolean> getLoginResult() {
        return loginResult;
    }
}
// 在Activity或Fragment中使用(简化示意View部分)
class LoginActivity {
    private LoginViewModel viewModel;
    void onCreate() {
        viewModel = new LoginViewModel();
        viewModel.getLoginResult().observe(this, result -> {
            if (result) {
                // 显示登录成功的界面
                System.out.println("登录成功");
            } else {
                // 显示登录失败的界面
                System.out.println("登录失败");
            }
        });
    }
    void onLoginButtonClicked(String username, String password) {
        viewModel.login(username, password);
    }
}

MVP架构模式

组件与其他组件关系数据流向示意
Model处理数据和业务逻辑,为Presenter提供数据Model → Presenter
View显示界面,定义与用户交互接口,从Presenter获取数据Presenter → View
Presenter从Model获取数据,处理View交互事件Model → Presenter;Presenter → View
伪代码示例
// Model
class LoginModel {
    boolean validateCredentials(String username, String password) {
        return "admin".equals(username) && "password".equals(password);
    }
}
// View
interface LoginView {
    void showLoginSuccess();
    void showLoginFailure();
}
// Presenter
class LoginPresenter {
    private LoginModel model;
    private LoginView view;
    LoginPresenter(LoginModel model, LoginView view) {
        this.model = model;
        this.view = view;
    }
    void onLoginButtonClicked(String username, String password) {
        boolean isValid = model.validateCredentials(username, password);
        if (isValid) {
            view.showLoginSuccess();
        } else {
            view.showLoginFailure();
        }
    }
}

MVI架构模式

组件与其他组件关系数据流向示意
Model存储数据和处理业务逻辑,为ViewModel提供数据Model → ViewModel
View展示界面,将用户输入事件转化为Intent发送给ViewModelView → Intent → ViewModel
ViewModel根据Intent从Model获取数据,生成ViewState发送给ViewIntent → ViewModel;Model → ViewModel;ViewModel → ViewState → View
伪代码示例
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
// Model
class LoginModel {
    boolean validateCredentials(String username, String password) {
        return "admin".equals(username) && "password".equals(password);
    }
}
// Intent
sealed class LoginIntent {
    data class Login(val username: String, val password: String) : LoginIntent()
}
// ViewState
data class LoginViewState(val isLoading: Boolean = false, val isSuccess: Boolean? = null)
// ViewModel
class LoginViewModel extends ViewModel {
    private LoginModel model;
    private MutableLiveData<LoginViewState> viewState = new MutableLiveData<>(new LoginViewState());
    LoginViewModel() {
        model = new LoginModel();
    }
    void processIntent(LoginIntent intent) {
        if (intent is LoginIntent.Login) {
            viewState.setValue(new LoginViewState(isLoading = true));
            boolean isValid = model.validateCredentials(intent.username, intent.password);
            viewState.setValue(new LoginViewState(isLoading = false, isSuccess = isValid));
        }
    }
    MutableLiveData<LoginViewState> getViewState() {
        return viewState;
    }
}
// 在Activity或Fragment中使用(简化示意View部分)
class LoginActivity {
    private LoginViewModel viewModel;
    void onCreate() {
        viewModel = new LoginViewModel();
        viewModel.getViewState().observe(this, state -> {
            if (state.isLoading) {
                // 显示加载中的界面
                System.out.println("正在登录...");
            } else if (state.isSuccess!= null) {
                if (state.isSuccess) {
                    // 显示登录成功的界面
                    System.out.println("登录成功");
                } else {
                    // 显示登录失败的界面
                    System.out.println("登录失败");
                }
            }
        });
    }
    void onLoginButtonClicked(String username, String password) {
        viewModel.processIntent(new LoginIntent.Login(username, password));
    }
}