在Android开发领域,随着应用程序的规模和复杂度不断增加,选择合适的软件架构模式变得至关重要。分层架构模式能够帮助开发者更好地组织代码,提高代码的可维护性、可扩展性和可测试性。MVC、MVVM、MVP和MVI是Android开发中常见的几种分层架构模式,它们各自有着独特的设计理念和适用场景。本文将深入探讨这几种架构模式之间的区别。
MVC架构模式
| 组件 | 与其他组件关系 | 数据流向示意 |
|---|
| Model | 与数据库或网络交互获取/存储数据,为Controller提供数据 | Model → Controller |
| View | 从Model获取数据展示,接收用户操作传递给Controller | View → Controller;Model → View |
| Controller | 接收View操作,调用Model方法,更新View | Controller → Model;Controller → View |
伪代码示例
class LoginModel {
boolean validateCredentials(String username, String password) {
return "admin".equals(username) && "password".equals(password);
}
}
class LoginView {
private LoginController controller;
void setController(LoginController controller) {
this.controller = controller;
}
void showLoginSuccess() {
System.out.println("登录成功");
}
void showLoginFailure() {
System.out.println("登录失败");
}
}
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;
class LoginModel {
boolean validateCredentials(String username, String password) {
return "admin".equals(username) && "password".equals(password);
}
}
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;
}
}
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 |
伪代码示例
class LoginModel {
boolean validateCredentials(String username, String password) {
return "admin".equals(username) && "password".equals(password);
}
}
interface LoginView {
void showLoginSuccess();
void showLoginFailure();
}
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发送给ViewModel | View → Intent → ViewModel |
| ViewModel | 根据Intent从Model获取数据,生成ViewState发送给View | Intent → ViewModel;Model → ViewModel;ViewModel → ViewState → View |
伪代码示例
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
class LoginModel {
boolean validateCredentials(String username, String password) {
return "admin".equals(username) && "password".equals(password);
}
}
sealed class LoginIntent {
data class Login(val username: String, val password: String) : LoginIntent()
}
data class LoginViewState(val isLoading: Boolean = false, val isSuccess: Boolean? = null)
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;
}
}
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));
}
}