【Android】浅谈安卓MVC框架设计

jopen 4年前

关于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=

 

来自: http://my.oschina.net/u/816576/blog/603553