【Android】浅谈安卓MVC框架设计
关于MVC是什么,就不多说了,找百科即可。
一、浅谈
MVC设计模式的初衷,就是为了让多个开发者共同开发时加快效率而设计的。
Model:只关注数据的处理,比如网络请求,计算坐标等;
View:只关注界面的描述,资源文件的xml就是了;
Controller:把Model跟View联动起来的关键,比如利用Model请求网络,然后控制View的显示。
举个例子,公司的一个项目要分配给3个开发员做。
可以这样分工:一个只做xml界面;一个只做Model;一个只做Controller;
这样分工的好处就是:
做xml的无需关注数据及界面的处理,只需做出静态的界面描述xml即可,这样的工作比较简单,可以分配给新人练练手;
做Model的无需关注界面,只需要专心对接接口,以及处理数据;
做Controller的则无需关注数据,只需要用Model实例来处理数据,然后展示界面即可。
做过安卓开发的都知道,一边写界面一边对接口一边更新界面到底有多痛苦,用MVC的话就可以让每个人只做一件相同的事,熟能生巧,越做越快。
二、实例架构
说了这么多,项目中到底怎么写,还是稍微说一下自己的架构设计吧:
项目中我会这样分包:
.mvc.controller .mvc.model .mvc.view
里面再根据项目分模块,其中controller放Action类,model放Model类,view放Activity;
注意:Action类实际上就是控制器,而Activity并不算是View,在onCreate中设置的xml才是view层。
下面还是给代码解释吧:
Action:
public class LoginAction extends BaseAction implements OnClickListener{ public LoginAction(AQuery aq) { super(aq); } private LoginModel model; @Override public void initModel() { model = new LoginModel(this); } @Override public void initView() { tm.dismissTitle(); aq.id(R.id.btn_login).clicked(this); aq.id(R.id.tv_create).clicked(this); aq.id(R.id.tv_forgot).clicked(this); } ... @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_login://login model.login(0); break; case R.id.tv_create://注册 ActJump.load(act, RegisterActivity.class); break; case R.id.tv_forgot://忘记密码 ActJump.load(act, ResetPwdActivity.class); break; default: break; } } }
Model:
public class LoginModel extends BaseModel{ public LoginModel(BaseAction action) { super(action); } /** * 请求登录 */ public void login(int flag){ String name = aq.id(R.id.et_name).getText().toString(); String pwd = aq.id(R.id.et_pwd).getText().toString(); Map<String, String> params = new HashMap<String, String>(); params.put("", name); params.put("", pwd); request("", params, flag); } }
View:
public class LoginActivity extends BaseActivity{ private LoginAction action; @Override public int initView() { return R.layout.activity_login; } @Override public void initAction(Bundle savedInstanceState) { action = new LoginAction(new AQuery(this)); action.init(getTitleManager()); } }
其中R.layout.activity_login即是真正的view层。
实际上把Activity当成控制器也可以,但这样Activity的代码就会显得臃肿,所以将控制器的代码全提取到Action类中,即使以后想在原来的基础上开发新界面,直接替换Action即可。
(上面用到的AQuery我就不解释了吧?至于BaseAction、BaseModel、BaseActivity每个人有自己的写法,我就不班门弄斧了)
三、题外话
当然,也有些人看不起MVC,觉得明明一个Activity能搞定的界面,居然要分3个类来写,实在烦。
好吧我承认,在我刚毕业那会也是这态度,直到我被客户逼着写MVC之后,我就彻底爱上这个设计模式了。
一个人做项目的时候,怎么舒服怎么来,当然是最快的。但是,项目后期又不可能只有你一个人做,说不定项目加入其它开发员了呢,也说不定你哪天辞职了呢,代码总归是要给人看的,不用点设计模式装B一下,怎么行呢?=w=