提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Android中的项目结构主要有MVC,MVP,MVVM,原始级别的MVC演变出来后两种,每种模式都各有优缺点,每一种模式的目的都是为了让业务逻辑更清晰,代码分离降低耦合度,方便长期的快捷维护,由于现在公司的项目比较old,还是原始的MVC模式,部分业务使用MVP模式,由于快速的迭代业务,部分代码甚至已经脱离模式,所以有必要重新整理下;
一、MVC简述
MVC(Model–View–Controller):即是模型(model)-视图(view)-控 制器(controller),后两种的演变都是基于此的发展。M层处理数据逻辑,V层显示结果,C层控制V和M的通信已到达分离的效果。对应到Android中View层一般指xml布局文件或者js+Html的方式,在activity中可以通过id获取布局控件的引用,C层通常指Activity协同V和M层处理业务逻辑,M层是指业务相关的数据结构和类,处理数据的请求,读写数据库等一些操作。
实现一个简单的MVC实例:
创建一个Android项目,项目结构如上图所示,httpUtil用于网络请求,DemoMainModel实现了BaseModel基类,BM中添加了一些在控制层(Activity、Fragment)公用的操作,
DemoMainModel中对数据请求并做处理,将数据返回给C。
MainActivity 中代码如下:
public class MainActivity extends AppCompatActivity {
private Button bt;
private TextView tvShow;
private DemoMainModel mainModel;
private UserInfo currentUserInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainModel = new DemoMainModel();
initView();
}
private void initView() {
bt = findViewById(R.id.bt_get);
tvShow = findViewById(R.id.tv_show);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mainModel.getUserInfo(101, new CallBack<UserInfo>() {
@Override
public void callBack(UserInfo userInfo) {
updateView();
}
});
}
});
}
private void updateView(){
if(currentUserInfo!=null){
tvShow.setText("Name:"+currentUserInfo.getName()+"Age:"+currentInfo.getAge());
}
}
}
在Activity中持有Model的引用,数据的请求处理被分离出来,而且如果业务过多,activity中的方法数量会过于繁多,也难以管理,达到非常臃肿的地步更加难以优化,因为涉及的业务逻辑太多,ac同时操作model和view,但对于Activity而言View层是无法分离的。
MVC总结
上述的过程是被动模式,Controller是唯一操作Model的类. 基于用户的响应事件, Controller通知Model更新数据. 在Model更新后, Controller通知View更新UI, View从Model中获取数据.对于主动模式而言,观察者模式可以做到多视图同时更新,Controller不是唯一操作Model的类, Model存在自更新机制. 在更新数据时, Model层使用观察者(Observer)模式通知View和其他类. View实现观察者的接口, 在Model中, 注册成为观察者, 接收通知.view和activity无法分离,UI的处理逻辑耦合,简单的说这种模式的问题就是activity中的代码量会越来越多。