开发的时候一般都会使用一些架构,好处就是代码逻辑清晰,将第模块之间的耦合,方便测试,维护;
常见的的架构:MVC、MVP、MVVM
MVC
MVC框架模式最早由Trygve Reenskaug 于1978年在Smalltalk-80系统上首次提出。经过了这么多年的发展,当然会演变出不同的版本,但核心没变依旧还是三层模型Model-View-Control。 可能由于MVP、MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM。因为后两种都是基于MVC发展而来的。
1、MVC设计图
![](https://img.haomeiwen.com/i22686430/a77137463b80bc4e.png)
2、MVC三层之间的关系
箭头→代表的是一种事件流向,并不一定要持有对方,比如上图中model→view的事件流向,view可以通过注册监听器的形式得到model发来的事件。在设计中model view controller之间如果要通讯,尽量设计成不直接持有,这样方便复用。也符合mvc的设计初衷
在android中三者对应的关系如下:
视图层(View)
对应于xml布局文件和java代码动态view部分
![](https://img.haomeiwen.com/i22686430/b9f095e363b29b55.png)
控制层(Controller)
MVC中Android的控制层是由Activity来承担的,Activity本来主要是作为初始化页面,展示数据的操作,但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑,承担的功能过多。
模型层(Model)
针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。
由于android中有个god object的存在activity,再加上android中xml布局的功能性太弱,所以activity承担了绝大部分的工作。所以在android中mvc更像是这种形式:
![](https://img.haomeiwen.com/i22686430/b1916a4b85ea22a7.png)
因为activity扮演了controller和view的工作,所以controller和view不太好彻底解耦,但是在一定程度上我们还是可以解耦的。
3、MVC总结
我们这里根据sample来总结下:
-
具有一定的分层,model彻底解耦,controller和view并没有解耦
-
层与层之间的交互尽量使用回调或者去使用消息机制去完成,尽量避免直接持有
-
controller和view在android中无法做到彻底分离,但在代码逻辑层面一定要分清
-
业务逻辑被放置在model层,能够更好的复用和修改增加业务
MVP
1、MVP说明
MVP跟MVC很相像,文章开头列出了很多种MVC的设计图,所以根据MVC的发展来看,我们把MVP当成MVC来看也不为过,因为MVP也是三层,唯一的差别是Model和View之间不进行通讯,都是通过Presenter完成。
前面介绍MVC的时候提到了算是致命缺点吧,在android中由于activity(god object)的存在,Controller和View很难做到完全解耦。但在MVP中就可以很好的解决这个问题
看下MVP的设计图:
![](https://img.haomeiwen.com/i22686430/331ba2b3feeaf938.png)
当将架构改为MVP以后,Presenter的出现,将Actvity视为View层,Presenter负责完成View层与Model层的交互。现在是这样的:
View 对应于Activity,负责View的绘制以及与用户交互
Model 处理数据和实体模型
Presenter 负责完成View于Model间的交互,主要的业务逻辑、
` #分割线代码部分
- Activity对应的View接口
public interface View {
void onSuccess(List<SqlBean> sqlBeans); //网络请求成功的方法
void fail(String str); //失败的方法
}
- Activity
public class ShowActivity extends AppCompatActivity implements View { //实现这个接口的两个方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
persenter = new Persenter(this); //presenter的对象
initView();
persenter.load(); //调用网络请求加载数据
}
@Override
public void onSuccess(List<SqlBean> sqlBeans2) { //成功请求数据放入列表集合中刷新适配器
sqlBeans.addAll(sqlBeans2);
rvAdapter.notifyDataSetChanged();
}
@Override
public void fail(String str) { //失败吐司错误信息
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
}
- Presenter层的claaback接口
public interface Callback{
void onSuccess(List<SqlBean> sqlBeans); //网络请求成功的方法
void fail(String str); //失败的方法
}
- Presenter层
public class Persenter implements Callback{
private View view;
private Model model;
public Persenter(View view) { //在activity中创建这个对象是传入的this就是activity类的实现的view
this.view = view;
this.model = new Model();
}
public void load() { //presenter对象调用此方法
model.load(this); //调用model的数据请求方法 传入callback的接口
}
//Callback接口的成功方法
@Override
public void onSuccess(List<NetBean.DataBean.DatasBean> datasBeans2) {
view.onSuccess(datasBeans2); //把成功的数据给view设置
}
//Callback接口的失败方法
@Override
public void fail(String str) {
view.fail(str); //把失败的数据给view设置
}
- model层
public class Model {
public void load(final CallBack callBack) {
Retrofit build = new Retrofit.Builder()
.baseUrl(ApiSerivce.NET_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiSerivce apiSerivce = build.create(ApiSerivce.class);
Call<NetBean> netBeanCall = apiSerivce.getnetBean();
netBeanCall.enqueue(new Callback<NetBean>() {
@Override
public void onResponse(Call<NetBean> call, Response<NetBean> response) {
if (response != null){
List<NetBean.DataBean.DatasBean> datas = response.body().getData().getDatas();
Log.i("TAG", "onResponse: "+datas.toString());
callBack.setSuccess(datas); //成功的话把数据设置给Callback接口
} else {
Log.i("TAG", "onResponse: 空");
}
}
@Override
public void onFailure(Call<NetBean> call, Throwable t) {
callBack.setFail(t.getMessage()); //失败的错误信息
}
});
}
}
网友评论