Android MVP和MVVM的区别

在Android开发中,MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)是常见的架构模式。它们都旨在将业务逻辑与UI分离,以实现更好的可测试性和可维护性。本文将介绍MVP和MVVM的区别,并提供代码示例进行说明。

MVP(Model-View-Presenter)

MVP是一种经典的架构模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和展示者(Presenter)。

  • 模型(Model):负责处理数据和业务逻辑。它通常包含对后端服务的调用、数据库操作和数据处理等。
  • 视图(View):负责显示数据和用户交互。它通常是Activity或Fragment,并且只负责处理UI相关的逻辑。
  • 展示者(Presenter):作为模型和视图之间的桥梁,负责处理业务逻辑、从模型获取数据并更新视图。它不直接操作UI,而是通过视图接口与视图进行通信。

MVP的关键点是视图和展示者之间的单向通信。展示者通过视图接口与视图进行交互。这种解耦使得视图和展示者可以独立进行测试和维护。

下面是一个简单的MVP示例:

// 定义视图接口
public interface LoginView {
    void showLoading();
    void hideLoading();
    void showError(String error);
    void showSuccess();
}

// View实现视图接口
public class LoginActivity implements LoginView {
    private LoginPresenter presenter;

    // ...

    @Override
    public void showLoading() {
        // 显示加载动画
    }

    @Override
    public void hideLoading() {
        // 隐藏加载动画
    }

    @Override
    public void showError(String error) {
        // 显示错误信息
    }

    @Override
    public void showSuccess() {
        // 显示登录成功的提示
    }
}

// 定义展示者接口
public interface LoginPresenter {
    void login(String username, String password);
}

// Presenter实现展示者接口
public class LoginPresenterImpl implements LoginPresenter {
    private LoginView view;

    public LoginPresenterImpl(LoginView view) {
        this.view = view;
    }

    @Override
    public void login(String username, String password) {
        view.showLoading();
        // 模拟登录请求
        if (username.equals("admin") && password.equals("123456")) {
            view.showSuccess();
        } else {
            view.showError("登录失败");
        }
        view.hideLoading();
    }
}

MVVM(Model-View-ViewModel)

MVVM是一种新兴的架构模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和视图模型(ViewModel)。

  • 模型(Model):同MVP中的模型,负责处理数据和业务逻辑。
  • 视图(View):同MVP中的视图,负责显示数据和用户交互。
  • 视图模型(ViewModel):作为模型和视图之间的桥梁,负责处理业务逻辑、从模型获取数据,并将数据转换成视图可用的形式。

MVVM的关键点是视图模型和视图之间的数据绑定。视图模型将数据绑定到视图上,当数据发生变化时,视图会自动更新。

下面是一个简单的MVVM示例:

// 定义视图模型
public class LoginViewModel extends ViewModel {
    private MutableLiveData<Boolean> loading = new MutableLiveData<>();
    private MutableLiveData<String> error = new MutableLiveData<>();
    private MutableLiveData<Boolean> success = new MutableLiveData<>();
    private LoginModel model;

    public LoginViewModel() {
        model = new LoginModel();
    }

    public LiveData<Boolean> getLoading() {
        return loading;
    }

    public LiveData<String> getError() {
        return error;
    }

    public LiveData<Boolean> getSuccess() {
        return success;
    }

    public void login(String username, String password) {
        loading.setValue(true);
        model.login(username, password, new LoginCallback() {
            @Override
            public void onSuccess() {
                success.setValue(true);
            }

            @Override
            public void onError(String errorMessage) {
                error.setValue(errorMessage);
            }
        });
        loading.setValue