前言
为赋新词,强说愁。本身功力就低,还想写点东西。。。善哉,善哉

为什么想写这个东西呢,因为感觉MVC是面向过程的编码思路,MVP是面向接口的编码思路,MVVM是数据驱动型的编码思路。
当然有可能不对,不过暂且写出来,如果日后发现不对的话再改。
1.我们先看MVC是什么?
日常我们都知道MVC中的M是model(数据源),V是view(视图,控件),C是controller即控制器,可以是activity,也可以是fragment。

我们可以看出mvc三者的关系过于密切,耦合性高,有点类似于面向过程编程。
2.MVP
MVP是针对MVC的缺点改进的框架模式,它把系统分为:Model、View、Presenter三部分。

MVP 是对MVC升级的一种模式,MVP和MVC不同的点是,MVP中Model和View不存在直接关系,中间隔着Presenter层,其负责调控View和Model之间的交互。
把主要业务逻辑放在Presenter层中,Presenter层可以抽象出BasePresenter层,只向View层、Model层暴露接口,这样做的好处就是在层级关系、接口和调用方式不变的情况下,修改整个下层功能。所以MVP类似于面向接口编程。
3.MVVM
MVVM是对MVP的一种升级,如果一个页面中相关UI的功能比较丰富的话,就会造成接口很庞大。而MVVM就是解决这个问题的。

这中结构看起来和MVP很像,其实不对,MVP中View和Presenter是相互持有的,就是虽然MVP好像是面向接口编程的,但还是会相互持有对方。而MVVM就是为了弱化这种持有,View和ViewModel之间是一种绑定的关系。MVVM中最重要的一个工具:DataBinding,是一种实现视图和数据的双向绑定的工具。使用方法如下:

android { 
    dataBinding{ 
        enabled true 
    } 
}

在gradle中添加以上配置。
通过DataBindingUtil可以生成一个viewDataBinding的子类,类名以layout文件名大写加Binding组成,如:

xxxBinding binding = DataBindingUtil.setContentView(this, R.layout.xxx);

在layout中需要配置,每个绑定的实体对象,以layout进行包裹,data中配置变量名和类型,通过@{}或@={}的方式进行引用,其中@={}表示支持双向绑定,目前支持双向绑定的控件如下:

AbsListView android:selectedItemPosition
CalendarView android:date
CompoundButton android:checked
DatePicker android:year, android:month, android:day
NumberPicker android:value
RadioGroup android:checkedButton
RatingBar android:rating
SeekBar android:progress
TabHost android:currentTab
TextView android:text
TimePicker android:hour, android:minute

layout中配置如下:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android">   
  <data> 
    <variable name="user" type="com.androfarmer.mvvm.model.SampleModel.UserInfo"></variable> 
  </data>   
  <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> 
    <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@={user.name}"/>   
    <TextView android:id="@+id/tv_age" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@={user.age+``}"/> 
  </LinearLayout> 
</layout> 

为了实现双向绑定,还需要对实体类进行处理,继承BaseObservable,对读写方法做@Bindable和notifyPropertyChanged处理。还可以直接使用官方提供的泛型可观察对象 ObservableField,比如:
private ObservableField name=new ObservableField<>();
所以MVVM是数据驱动的一种框架模式。
当然MVVM也是有很多问题,因为View和Model之间的耦合性太高,出现问题不太好定位,有可能是数据的问题,还有可能是View的问题。

发表评论

邮箱地址不会被公开。