基于MVP模式的Android应用开发研究
2018-06-11倪红军
倪红军
(南京师范大学泰州学院,江苏泰州225300)
随着移动互联网技术和智能终端技术的发展,基于Android平台的智能设备在人们的生活中越来越普及,运行于Android平台上的相应软件也越来越多,每个软件承载的功能也是越来越强,采用传统的MVC(Model—View—Controller)开发模式开发 的Android平台软件,视图层(View)一般采用XML文件进行界面描述,控制层(Controller)的功能通常由Activity担当,模型层(Model)用来实现对数据库、网络及业务计算等的操作。虽然MVC模式将界面呈现和逻辑代码分离开了,但View对应的XML文件实际能实现的功能很少,很多界面呈现都必须由Controller对应的Activity完成,这样Activity既充当了View的角色,又充当了Controller的角色。随着用户界面及其业务逻辑的复杂度不断提升,Activity的职责也会不断增加,使得Activity越来越庞大臃肿和耦合度越来越高,从而导致项目的后期维护变得越来越复杂[1-3],对于开发周期比较短的小型项目这种模式是可以接受的,但如果开发一个界面和业务逻辑复杂度都很高的项目来说,这种开发模式耦合度高、维护困难等问题就突显出来了。综上所述,传统的MVC开发模式并不很适合运用于Android平台软件的开发。
针对以上问题,在进行Android平台软件开发时,需要探索另外一种更适合的开发模式进行Android平台软件的开发,以便将复杂的业务逻辑进行分解处理,让Activity的职责更加单一、代码耦合度更低、软件结构层次更加清晰,以提高代码的灵活性和可维护性。经过研究和实践发现MVP模式能够很好的解决这类问题。本文通过对MVP开发模式的研究分析,探讨Android应用开发中使用MVP开发模式的原因,并结合基于Web Service的教师任课信息管理系统的登录模块实现过程,探讨Android应用开发中使用MVP开发模式的软件设计流程。
1 MVP开发模式
1.1 MVP设计思想
MVP(Model-View-Presenter)模式是 2000年左右由IBM开发出来的一个针对C++和Java的编程模型,是 MVC(Model-View-Controller)模式演变而来的,在应用开发中它们具有基本相通的设计思想:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。MVC的设计模型图如图1所示,MVP的设计模型图如图2所示。
图1 MVC设计模式
图2 MVP设计模式
在MVC设计模式中,Model是应用程序中用于处理业务逻辑的部分,通常负责定义数据修改和操作的业务规则;View是应用程序处理数据显示的部分,通常负责展示依据Model创建的数据;Controller是应用程序中处理用户交互的部分,通常负责处理流入的请求[4-6]。当View接收用户的输入后,可以通过Controller修改对应的Model实例数据,也可以由View层直接更新Model数据[7-10];当Model的数据发生变化并需要修改用户界面时,可以通过Controller实现。
从图1可以看出,在MVC模式中View是可以直接访问Model的,所以View中也会包含Model信息和一些业务逻辑。Model不依赖于View,但View是依赖于Model的。由于一些业务逻辑在View里实现,从而导致View的更改比较困难,业务逻辑也无法重用。
在MVP设计模式中,Model和View的主要功能与MVC设计模式基本相同,Presenter是Model与View之间的桥梁,它从Model获得数据后,返回给View,使得View与Model之间没有耦合,也将业务逻辑从View中抽离出来。
从图2可以看出,在MVP模式中Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时可以保持Presenter不变。这样的分层模式大大降低了Model层与View层的耦合度,一方面可以实现View层和Model层的单独开发与测试,互不依赖;另一方面有利于Model层的封装复用,大大减少了代码量[11-12]。
1.2 MVP模式的实现过程
在Android应用开发中使用MVP模式,将Model层和View层通过Presenter层实现完全分分离,主要的业务逻辑在Presenter层中实现。Presenter层持有View层和Model层的Interface(接口)引用,View层持有Presenter层的Interface(接口)引用。当View层的某个用户界面(UI)需要展示数据时,首先调用Presenter层的相关Interface,然后Prensenter层调用Model层请求数据,当Model层数据加载成功后,调用Presenter层的CallBack(回调方法)通知Presenter层数据加载完毕,最后Presenter层调用View层的Interface将加载后的数据在用户界面展示。
2 MVP模式在Android应用开发中的应用
使用MVP模式进行Android应用开发时,MVP模式主要包含4个关键部分:
1)View:由 Activity类或 Fragment类实现,负责与用户的交互及视图部分展示;
2)View interface:需要View实现的接口,其中定义了View行为的抽象,View通过该接口与Presenter进行交互,使用该接口主要为降低程序间的耦合度;
3)Model:负责存储、访问数据的实体类,数据可以是远端的Server API、本地数据库或SharedPrefer⁃ences等;
4)Presenter:负责完成View与Model间交互的业务逻辑类,一个Presenter可以对应多个View。
下面就以基于Web Service的教师任课信息管理系统的登录模块为例介绍MVP模式在Android应用开发中的实现过程。登录模块包括Web Service服务器端和Android客户端两个部分。
2.1 服务器端的实现
服务器端是基于ASP.Net平台创建的Web Service,向开发者提供调用接口如图3所示。其中username表示登录用户的用户名,password表示登录用户的密码。如果登录用户是管理员,返回“1”;如果登录用户是普通教师,返回“2”;否则返回“3”。Web Service的实现技术不是本文研究内容,所以不作详述。
图3 Web Service调用接口
图4 客户端目录结构
2.2 客户端的实现
客户端使用MVP模式实现,实现的目录结构如图4所示。
2.2.1 Model层的实现
登录模块的Model层主要负责从Web Service服务器获取登录信息,由ITeacher和LoginOnListener两个接口类及一个TeacherImpl实现类组成。
1)ITeacher和LoginOnListener接口类
ITeacher接口定义了需要实现的login方法,其关键代码如下:
LoginOnListener接口定义了登录后需要处理的adminSuccess()、teacherSuccess()和loginFailed()方法,分别表示管理登录成功、老师登录成功和登录失败。
2)TeacherImpl实现类
由于从Web Service服务器获取登录信息是一个耗时操作,所以需要使用线程实现[13-17]。其中LinkWeb是自定义的一个访问Web Service的工具类,关键代码如下:
2.2.2 View层的实现
View层登录模块展示的组件是AppCompatAc⁃tivity,其布局文件使用嵌套的RelativeLayout布局,运行后的效果如图5所示。为了方便Presenter与View的交互,View层定义了一个ITeacherLoginView接口类,该接口中包含了登录成功页面跳转方法、加载过程中给用户信息提示方法、从登录界面获取用户名和密码的方法,其关键代码如下:
图5 登录界面
在登录界面AppCompatActivity中实现ITeacher⁃LoginView 接口,并重写 toFirstActivity()、showToast(String msg)、getUsername()及 getPassword()方法,以实现相关功能。
2.2.3 Presenter层的实现
View层需要调用Presenter层访问Model层的信息,所以在Presenter层定义了一个实现LoginOnLis⁃tener接口的LoginPresenter类,其中包含一个需要传入View层的接口对象iTeacherLoginView、一个用于访问Model层的信息的login方法及LoginOnListener接口中需要重写的方法,其关键代码如下:
当用户在LoginActivity界面单击Button后,Logi⁃nActivity会调用 LoginPresenter的 login方法,Login⁃Presenter的login方法中又会调用ITeacher中的login方法。ITeacher中的login方法是加载数据的核心,通过自定义的LinkWeb工具类中的connectService⁃ForLogin方法请求Web Service服务器接口获取数据,并通过LoginOnListener接口回调给LoginPresenter。
3 结束语
文中通过对Android应用开发中使用MVC模式实现过程进行分析,发现了MVC模式中充当View层功能的xml文件控制能力较弱,诸如动态隐藏/显示按钮等功能在xml中根本没有办法实现,只能将实现代码写到Activity中,造成了Activity在MVC模式中既充当了Controller,又充当了View,从而导致Activity臃肿不堪、业务逻辑耦合度高及项目后期维护难度大等问题。
根据MVP模式的设计思想,Android应用开发中的Model与MVC模式中一样,而Activity不再是Controller的角色,而纯粹是View的角色,所有的业务事件统一由Presenter负责处理,Model和View完全解耦,从而使Android平台的应用开发模块职责划分明显、代码复用度高和灵活性强,便于项目的后期维护和功能扩展。为了验证MVP模式在Android应用开发中的可行性,最后基于MVP模式设计并实现了教师任课信息管理系统登录模块,达到了预期效果。