Mvvm 与 MVP 的区别在 Android 中的实现

在 Android 开发中,MVVM(模型-视图-视图模型)和 MVP(模型-视图- presenter)两种设计模式是最流行的架构模式。具体来说,它们在数据处理、用户界面更新以及组件之间的交互方式上有所不同。本文将帮助你理解这两种模式,并提供代码示例来阐明它们的主要区别。

设计流程

首先,我们可以通过表格来梳理实现这两种模式的步骤。

步骤 MVC/MVP/MVVM 说明
1 选择模式 确定使用 MVP 还是 MVVM 设计模式
2 定义模型 创建数据模型用于存储和处理业务逻辑
3 创建视图 设计 XML 布局文件
4 编写 Presenter/ViewModel 实现业务逻辑,协调数据与视图
5 更新视图 通过接口或数据绑定更新视图显示

步骤详解

1. 选择模式

在这一步你需要决定使用 MVVM 还是 MVP。一般而言,如果你倾向于使用数据绑定而且希望提高可测试性,那么选择 MVVM。而如果你的应用更侧重于明确的输入和输出,MVP 可能更好。

2. 定义模型

// Model.java
public class Model {
    private String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

此代码定义了数据模型类 Model,包含了简单的 getter 和 setter 方法。

3. 创建视图

<!-- activity_main.xml -->
<LinearLayout xmlns:android="
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me"/>
</LinearLayout>

该布局文件 activity_main.xml 包含 TextViewButton 控件。

4. 编写 Presenter/ViewModel

MVP 示例
// Presenter.java
public class Presenter {
    private Model model;
    private View view;

    public Presenter(Model model, View view) {
        this.model = model;
        this.view = view;
    }

    public void onButtonClick() {
        model.setData("Hello MVP");
        view.updateText(model.getData());
    }
}

// View.java
public interface View {
    void updateText(String data);
}

在 MVP 的实现中,Presenter 类管理着 ModelView 的交互。

MVVM 示例
// ViewModel.java
public class ViewModel extends ViewModel {
    private MutableLiveData<String> text;

    public LiveData<String> getText() {
        if (text == null) {
            text = new MutableLiveData<>();
            loadData();
        }
        return text;
    }

    private void loadData() {
        text.setValue("Hello MVVM");
    }
}

在 MVVM 的实现中,ViewModel 负责存储和管理 UI 相关的数据。

5. 更新视图

在 MVP 中
// MainActivity.java
public class MainActivity extends AppCompatActivity implements View {
    private TextView textView;
    private Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
        presenter = new Presenter(new Model(), this);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(v -> presenter.onButtonClick());
    }

    @Override
    public void updateText(String data) {
        textView.setText(data);
    }
}
在 MVVM 中
// MainActivity.java
public class MainActivity extends AppCompatActivity {
    private ViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewModel = new ViewModelProvider(this).get(ViewModel.class);
        final TextView textView = findViewById(R.id.textView);
        
        viewModel.getText().observe(this, textView::setText);
        
        Button button = findViewById(R.id.button);
        button.setOnClickListener(v -> viewModel.loadData());
    }
}

总结

通过以上示例,我们可以看到 MVP 和 MVVM 的主要区别在于二者的职责划分和数据处理方式。MVP 更加依赖于传统的接口和事件回调,而 MVVM 则利用了 Android 的 LiveData 和数据绑定,这让代码更加简洁且易于测试。在实际应用中,你可以根据项目的需求和团队的技术栈选择合适的框架。

饼状图

pie
    title MVVM与MVP使用比例
    "MVVM": 60
    "MVP": 40

希望这篇文章能帮到你,让你对 MVVM 和 MVP 在 Android 开发中的应用有更深入的理解!