【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=