MVC架构
• 模型层(Model):我们针对业务模型,建立的数据结构和相关的类,就可以理解为Model。Model是与View无关,而与业务相关的。
• 视图层(View):一般采用 XML 文件或者 Java 代码进行界面的描述,也可以使用JavaScript+HTML等方式作为View层。
• 控制层(Controller):Android 的控制层通常在 Activity、Fragment 或者由它们控制的其他业务类中。
缺点:
1. Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而做出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。
2.View层和Model层相互耦合,不易开发和维护。
MVP架构
MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过Controller。
在开发的时候,Model-提供数据,View负责UI,Presenter,负责处理逻辑,提供view需要的数据,各执其责,这样,各个模式,各个类,分工明确,可以清晰的,降低耦合,层级职责更明显,易于单元测试
mvp模式的简单理解
MVP模式呢,就是把Activity复杂的逻辑,拆分并分类,都有各个的职责,那么这样逻辑也清楚了,也利于维护,咱们就拿很乱的房间做比喻,房间东西少的话我们就能很快的找到自己想要的东西,那么东西多了,有放的比较乱,那么我们找起来是不是很费劲,如果把相应的东西摆到相应的位置那么,我们房间东西再多我们也能找到自己想要的东西,那如果项目还有新的需求我们也很容易的添加新的功能,我们也可以单独按照新的分类,分出一块添加到项目中,这样就有利于更新,维护我们的项目
那么咱们简单实现一个MVP模式完成的项目。
首先我们写Model
public class DataModel {
List<String> data = new ArrayList<>();
ModelInterface mCallback;
public DataModel(ModelInterface mCallback){
this.mCallback = mCallback;
}
public void getData(){
for (int i = 0; i < 100; i++) {
data.add(i + "item");
}
mCallback.loadSuccess(data);
new AsyncTask<String,Integer, List<String> >(){
@Override
protected List<String> doInBackground(String... strings) {
for (int i = 0; i < 100; i++) {
data.add(i + "item");
}
return data;
}
@Override
protected void onPostExecute(List<String> list) {
super.onPostExecute(list);
mCallback.loadSuccess(list);
}
};
}
}
数据封装好了,我们可以在Application 类初始化 让数据刚运行的时候就加载出来
public class MVPApp extends Application {
@Override
public void onCreate() {
super.onCreate();
new DataModel(new MvpPrenter()).getData();
}
}
接口:成功操作数据,失败提示
public interface ModelInterface {
void loadSuccess(List<String> data);
void loadFailed();
}
Presenter处理逻辑提供数据
public class MvpPrenter implements ModelInterface {
DataModel dataModel = new DataModel(this);
MvpView mvpView ;
public MvpPrenter(MvpView mvpView){
this.mvpView = mvpView;
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void loadSuccess(List<String> data) {
mvpView.setListItem(data);
}
@Override
public void loadFailed() {
}
}
View的使用
public class MainActivity extends AppCompatActivity implements MvpView{
private MvpPrenter mvpPrenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mvpPrenter = new MvpPrenter(this);
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void setListItem(List<String> data) {
data.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
// Log.i("loadSuccess",s);
}
});
}
}
public interface MvpView {
void setListItem(List<String> data);
}