美文网首页
MVP MVC MVVM概念解析

MVP MVC MVVM概念解析

作者: 金馆长说 | 来源:发表于2018-08-23 18:36 被阅读10次

MVC

Model 数据层(网络数据,数据库,缓存)
View XML布局
Controller 对应于Activity,处理跳转,业务逻辑,处理数据。

这个在android的最基本的设计模式,我用于请求的网络数据,数据库,缓存库封装的类都可以层位model层。activity中会直接持有这些model的引用,xml中处理view视图布局。这种模式在项目变大的时候,会出现activity承担的任务太多,因为它会处理网络请求的调用,数据层,逻辑层,UI层。我们经常遇到这种情况,一个activity中可能会有几千行代码。

MVP

Model 数据层(网络数据,数据库,缓存)
View Activity和XML布局,负责绘制UI和显示UI。
Presenter 负责连接View和Model的交互逻辑

前面说的mac模式中的Controller的activity会出现很多处理逻辑和数据层的代码,mvp就可以解决这个问题。

实现逻辑

  • 响应view
    P也叫Presenter其核心就是通过持有一个抽象的view接口,来操作真正实现这个抽象的view层,一般我们的activity会实现这个抽象的view接口,来响应在Presenter层中的抽象view调用。

  • 获取model
    还有就是把一些操作model层的逻辑也封装了起来,在p层中操作需要的数据层,然后通过view接口实现回调,达到把数据传输到view的实现类也就是Activity。

  • 结论
    好处

  1. 解耦
  2. 复用性好

缺点

  1. view的抽象接口会比较多
  2. 还是有耦合如何view的接口变更响应的实现也全部要变更
  3. 如果P层逻辑太多依然会导致代码臃肿的问题

得到的就是p层是view(activity)和model之间的一个纽带,view和model之间没有任何关系,但是通过实现一个抽象view,传输到p层。p层持有这个抽象view之后就可以把获取的数据通过view抽象回调给实现类了。达到了解耦的操作,还有一个就是如果某个地方有相同的逻辑,还可以直接复用P层。

MVVM

model还是原来的数据层,view是xml和activity。vm就是ViewModel操作封装了业务逻辑和数据操作,配合DataBanding数据库绑定框架,实现以数据驱动改变,实现业务分离。解决MVP出现的接口定义过多,接口一改变全部改变的一些问题。

ViewModel具体实现

  1. 利用DataBanding的xml定义里面有一个ViewModel属性
  2. ViewModel接收一个DataBanDing的对象把VM传入给刚刚定义的属性
  3. xml数据绑定的地方操作vm对象的业务逻辑方法
public class MainViewModel {  
  
    private ActivityMainBinding activityMainBinding;  
    private ContentMainBinding contentMainBinding;  
    private AppCompatActivity activity;  
  
    private UserBean user;  
  
    public MainViewModel(AppCompatActivity activity, ActivityMainBinding activityMainBinding){  
        this.activity = activity;  
        this.activityMainBinding = activityMainBinding;  
        this.contentMainBinding = activityMainBinding.contentMain;  
        init();  
    }  
  
    public void init(){  
        activity.setSupportActionBar(activityMainBinding.toolbar);  
        activityMainBinding.fab.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)  
                        .setAction("Action", null).show();  
            }  
        });  
        user = new UserBean();  
        contentMainBinding.setViewModel(this);  
  
    }  
  
    public void applyUser(View v){  
        Snackbar.make(v,"提交成功",Snackbar.LENGTH_SHORT).setAction("Action",null).show();  
        user.name.set(contentMainBinding.name.getText().toString());  
        user.sex.set(contentMainBinding.sex.getText().toString());  
        user.age.set(Integer.valueOf(contentMainBinding.age.getText().toString()));  
    }  
  
}

model View ViewModel

Model 数据层(网络数据,数据库,缓存)
View Activity和XML布局,负责绘制UI和显示UI。
ViewModel 通过ViewModel完成model和view的交互

前面说到mvp中会存在一些问题,接口的过多,实现抽象view的地方会有的耦合变更不方便。但是通过ViewModel可以解决这个问题

ViewModel
它的唯一作用和概念就是它只做数据层面的操作,比如网络请求,比如数据库操作。这些操作都可以放在ViewModel中,当我们项目的代码一大的时候就可以看到它的好处了。当然光是这样还不能满足我的期望,这个时候LiveData就上场了。

LiveData
LiveData是一个抽象的数据类,它的主要作用是提供通知给View层做数据刷新。通过LiveData包装的数据类,只要数据集一变更,监听通知的地方就会自动收到数据刷新的回调,可以在Activity中通过observe方法监听一个数据的更新。

通过这个组合发现我们连接口都不需要定义了,而且没有什么接口变更导致实现类也需要变更的情况。我们直接通过LiveData持有一个数据引用数据更新后,自动会在监听的地方会调用数据,然后View层(Activity)的view直接使用数据进行属性UI的操作。

相关文章

网友评论

      本文标题:MVP MVC MVVM概念解析

      本文链接:https://www.haomeiwen.com/subject/gvvmiftx.html