浅析MVC、MVP、MVVM架构
搞懂Android三大架构
前言
梳理一下MVC、MVP、MVVM架构,逐一解析,让你对这个三个架构有初步认识。根据它们的优缺点,选择最合适的架构运用在自己的项目中。
最原始的MVC:
- M:model,项目中bean,sp,database,file以及操作数据相关的类。
- V:view,项目中的xml视图文件。(其实activity和fragment也可以理解成view,因为我们需要它们展示界面,以及一些弹窗,但更多承载的是control)
- C:control,项目中的activity,fragment,用来编写代码逻辑。
MVC是通过Control将view和model联系在一起。举一个最简单的列子,比如我们有一个StudentBean对象,对象中有name和age属性。我们需要通过网络请求的方式获取name和age的值,并创建StudentBean对象。xml视图中有两个TextView需要分别展示name和age。
功能逻辑:
- 新建xml视图,创建两个TextView。
- 在actvity中展示视图,并且通过findViewById获取到TextView。
- 创建StudentBean类
- 在activity中通过网络请求的方式获取StudentBean。
- 在activity中把StudentBean的name和age赋值给TextView。
其中1、2步骤属于View的操作,3步骤是model。4、5步骤是Control。
我们不难发现,Control(activity)需要完成view和model的连接。这也就是mvc架构的弊端,大量的代码容积在activity中,不利于代码的管理和阅读。当然我们平时写代码的时候并不会把所有的功能逻辑都写在activity中,可能会封装一些辅助类来完成对应的功能。但是这些方法的调用也都是在activity中触发的。虽然代码上有所简洁,但是逻辑依旧不够清晰。
升级版MVP:
- M:model,项目中bean,sp,database,file以及操作数据相关的类。
- V:view,项目中的xml视图文件。(其实activity和fragment也可以理解成view,因为我们需要它们展示界面,以及一些弹窗,但更多承载的是control)
- P:presenter,接替了mcv中 C 的工作,解放出activity或者fragment。
MVP其实就是mvc的升级版,所有的代码逻辑将在presenter中完成,并且将view和model相互连接在一起,view和model之间并没有直接的关联。只需要view提供相关的接口,然后再在presenter回调其接口,将model的数据返回给view就可以了。此时的activity更多充当的是view的工作,它只需要提供接口给presenter就可以了,然后等待presenter的回调,去更新对应的视图。
下面我们通过代码来搭建MVP架构
以下,View部分:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="50dp" />
<TextView
android:id="@+id/tv_age"
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>
以下,这并不是实际的View,只是给View(Activity)提供的接口
import com.Student;
public interface MyView {
void setStudent(StudentBean bean);
}
以下,Activity也是属于View,提供接口给Presenter回调,用来传递model,刷新界面
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.TextView;
import com.showinfo.yungui.R;
public class MyActivity extends Activity implements MyView {
private TextView tv_name;
private TextView tv_age;
private MyPresenter myPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
tv_name = findViewById(R.id.tv_name);
tv_age = findViewById(R.id.tv_age);
myPresenter = new MyPresenter(this);
myPresenter.getData();
}
@Override
public void setStudent(StudentBean bean) {
tv_name.setText(bean.getName());
tv_age.setText(bean.getAge());
}
}
在Presenter中封装数据,将view和model通过接口的方式关联
import org.xutils.HttpManager;
public class MyPresenter {
private MyView myView;
public MyPresenter(MyView myView) {
this.myView = myView;
}
public void getData(){
//此出应该通过网络请求获取StudentBean,我们直接模拟数据
StudentBean studentBean=new StudentBean();
studentBean.setAge("12");
studentBean.setName("mark");
myView.setStudent(studentBean);
}
}
mvp很好得解放了activity,让view和model通过presenter关联。但是需要view层提供接口,如果当前得功能逻辑比较复杂,那么就需要提供大量得接口给presenter,所以依然存在弊端。
终极版MVVM:
- View: 对应于Activity和XML,负责View的绘制以及与用户交互。
- Model: 实体模型。
- ViewModel: 负责完成View与Model间的交互,负责业务逻辑。
MVVM的目标和思想与MVP类似,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。
记录学习,仅供参考。