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。结论
好处
- 解耦
- 复用性好
缺点
- view的抽象接口会比较多
- 还是有耦合如何view的接口变更响应的实现也全部要变更
- 如果P层逻辑太多依然会导致代码臃肿的问题
得到的就是p层是view(activity)和model之间的一个纽带,view和model之间没有任何关系,但是通过实现一个抽象view,传输到p层。p层持有这个抽象view之后就可以把获取的数据通过view抽象回调给实现类了。达到了解耦的操作,还有一个就是如果某个地方有相同的逻辑,还可以直接复用P层。
MVVM
model还是原来的数据层,view是xml和activity。vm就是ViewModel操作封装了业务逻辑和数据操作,配合DataBanding数据库绑定框架,实现以数据驱动改变,实现业务分离。解决MVP出现的接口定义过多,接口一改变全部改变的一些问题。
ViewModel具体实现
- 利用DataBanding的xml定义里面有一个ViewModel属性
- ViewModel接收一个DataBanDing的对象把VM传入给刚刚定义的属性
- 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的操作。