1.MVC优缺点
Android中的MVC
模型层(M):针对业务模型,建立的数据结构以及相关的类,例如对数据库的操作,对网络数据的操作以及业务中的计算等操作应该放在该层。
视图层(V):Android中的xml文件可以理解为视图层。
控制层(C):Android中的逻辑处理在Activity中体现。
MVC的优点:
1):分工明确,各司所职。
2):一定程度上降低了代码间的耦合性。
MVC的缺点:
1):随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。
2):视图和控制器间过于紧密的联系,妨碍了各自的重用。
2.MVP优缺点
MVP是模型(model)-视图(view)-协调者(presenter)的缩写。
模型层(M):负责存储,检索以及操纵数据。
视图层(V):负责绘制UI,与用户进行交互(在Android中体现为Activity)
协调者(P):作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
MVP的优点:
1)复杂的逻辑处理放在presenter进行处理,减少了activity的臃肿。
2)M层与V层完全分离,修改V层不会影响M层,降低了耦合性。
3)可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。
3)P层与V层的交互是通过接口来进行的,便于单元测试。
MVP的缺点:
由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁,视图需要改变,一般presenter也需要跟着改变。
3.MVVM优缺点
MVVM是MVP的升级版本,VM是ViewModel的缩写,VM可以理解为View的数据模型和Presenter的合体,ViewModel和View之间的交互通过data binding完成。
ViewModel(VM):ViewModel就是包含View的一些数据属性和操作,关键点就是使用databinding,View的变化会直接影响ViewModel,ViewModel的变化或者内容也会直接体现在View上。
优点:
Data Binding可以实现双向的交互,使得视图和控制层之间的耦合程度进一步降低,分离更为彻底,同时减轻了Activity的压力。
缺点:
数据绑定使得 Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。
MVVM例子步骤 1) build.gradle添加
android {//添加
dataBinding {
enabled true
}
}
2)实体类
package com.zhisheng.test.mvvm;
public class User {
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
}
3)Model
package com.zhisheng.test.mvvm;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MVVMViewModel {
//各种逻辑 各种处理方法
public void onClickName(View view){
TextView view1 = (TextView) view;
Toast.makeText(view.getContext(),view1.getText().toString(),Toast.LENGTH_SHORT).show();
}
}
4)xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.zhisheng.test.mvvm.User" />
<variable
name="myHandlers"
type="com.zhisheng.test.mvvm.MVVMViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:onClick="@{myHandlers.onClickName}"
android:text="@{user.userName}"
/>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:text="更新数据"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
5)Activity
package com.zhisheng.test.mvvm;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import com.zhisheng.test.R;
import com.zhisheng.test.databinding.ActivityMvvmBinding;
public class MVVMActivity extends Activity {
ActivityMvvmBinding mViewDataBinding;//有了xml绑定会自动生成
User user;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewDataBinding=DataBindingUtil.setContentView(this,R.layout.activity_mvvm);
user=new User();
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//模拟数据更新
user.setUserName("android "); ;
mViewDataBinding.setUser(user);
}
});
user.setUserName("android222");
mViewDataBinding.setUser(user);
mViewDataBinding.setMyHandlers(new MVVMViewModel());
}
}
##更优雅的MVVM+jetpack例子
网友评论