Android架构设计之MVC模式
vc基本概念">一、mvc基本概念
mvc(model-view-controller,模型-视图-控制器)模式在android中曾经是比较流行的架构设计模式;使用mvc设计模式的好处ui界面与业务逻辑数据的分离,在修改或者优化界面及用户交互的同时,无需重新编写业务逻辑。android中的mvc的角色如下:
模型层(model):是用进行业务逻辑的处理,比如一些网络访问操作、的操作等等,总之一些耗时操作的任务。 视图图(view):主要是处理数据显示的部分,在android中xml布局就可以视为v层。 控制层(controller):在android中,activity是处理用户交互问题,因此通常把activity或者fragment视为控制器,通过c层来操作m层获取数据,并把数据返回给v层显示。二、mvc基本使用
项目目录结构分成了三个目录,分别是model、controller、listener,其中model目录下存放一些javabean类和业务数据获取接口及其实现类(网络访问);controller目录存放activity或者fragment;listener目录下是存放网络访问操作结果的回调接口,目的是将数据返回给view层显示。下面一个简单登录为例:
loginlistener接口:其实这个接口实现回调也相当于model层中一部分。
/** * desc:登录回调监听 */ public interface loginlistener { /*请求前一些准备,比如加载提示等待*/ void onstart_(); /*访问成功调用*/ void onsuccess(t t); /*访问失败*/ void onfailed(); /*访问结束*/ void onfinish(); }
model层:
/** * desc: 用户信息实体类 */ public class userinfo { private string username; private string sex; public string getusername() { return username; } public void setusername(string username) { this.username = username; } public string getsex() { return sex; } public void setsex(string sex) { this.sex = sex; } }
/** * desc: login-model */ public interface loginmodel{ void getuserinfo(string username, string pwd, loginlistener listener); }
/** * desc:loginmodel的实现类,网络异步访问 */ public class loginmodelimpl implements loginmodel{ @override public void getuserinfo(string username, string pwd, loginlistener listener) { userinfo userinfo = new userinfo(); userinfo.setusername(username); //下面是模拟网络访问结果的调用 listener.onstart_(); if (!textutils.isempty(username) && !textutils.isempty(pwd)){ listener.onsuccess(userinfo); }else { listener.onfailed(); } listener.onfinish(); } }
view层:xml布局
controller层:
public class mainactivity extends appcompatactivity implements loginlistener { private edittext metname; private edittext metpassword; private button mbutlogin; private loginmodelimpl mloginmodel; private progressdialog mprogressdialog; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); metname = findviewbyid(r.id.et_user_name); metpassword = findviewbyid(r.id.et_password); mbutlogin = findviewbyid(r.id.but_login); mloginmodel=new loginmodelimpl(); mbutlogin.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { //登录 string username = metname.gettext().tostring(); string pwd = metpassword.gettext().tostring(); mloginmodel.getuserinfo(username,pwd,mainactivity.this); } }); } @override public void onstart_() { log.d(tag, "onstart_: "); mprogressdialog=new progressdialog(this); mprogressdialog.settitle("请求中……"); mprogressdialog.show(); } @override public void onsuccess(userinfo userinfo) { log.d(tag, "onsuccess: "); mprogressdialog.dismiss(); toast.maketext(this,"登录成功",toast.length_short).show(); } @override public void onfailed() { log.d(tag, "onfailed: "); toast.maketext(this,"登录失败",toast.length_short).show(); } @override public void onfinish() { log.d(tag, "onfinish: "); mprogressdialog.dismiss(); } private static final string tag = "mainactivity"; }
上面例子是mvc的简单运用,当你点击登录就是获取登录数据,通过modle层中的接口实现类(loginmodelimpl)来获取网络数据,并把数据返回view层显示交互,从上面例子可以看出,controller控制器activity一定程度上实现了视图ui层与数据modle层的解耦,将view层和modle
层进行了分离,但并不是十分完美,就是在controller层activity中同时存在布局视图初始化和业务逻辑操作响应,也就是view层初始化和controller层同时绑定到同一类中。当业务越来越复杂时,activity的职责会越来越多,代码会越来越浮肿,不利于后期的维护。
上一篇: Linux运维之Oracle数据库自动备份脚本功能实施
下一篇: oracle的学习笔记