APP下载

MVC模式在Android开发上的应用研究

2017-03-16刘娜刘如起

山东工业技术 2017年3期

刘娜+刘如起

摘 要:根据Android应用开发语言Java的特点以及MVC模式的思想,提出一种基于注解的MVC模式,可用于Android应用的快速开发中,并根据Android跨进程应用的特点,提出一种解决方案,可使MVC模式用于跨进程应用中。

关键词:Android;Java;MVC;注解;AIDL

DOI:10.16640/j.cnki.37-1222/t.2017.03.118

随着搭载Android系统的智能设备的普及,对Android应用的需求也越来越大,需要一种好的设计模式提高开发的效率。MVC(模型-视图-控制器)设计模式将数据和表现进行分离,既可以使数据以不同的形式表现,又可以方便的更换数据来源从而提高开发效率。由于Android系统以Java语言做为上层开发语言,本文基于MVC设计模式思想以及Java语言的特点,提出了一种基于注解的MVC开发框架,可大大简化应用程序设计。又根据Android应用程序的特点,提出了一种针对跨进程应用使用该框架的方案,提高了框架的适用性。

1 MVC模式简介

MVC设计模式是一种“分治”的思想,它将模型和视图分离,从而使同一组数据可以使用不同的表现形式。MVC由三部分组成:模型(Model),视图(View)及控制器。模型即数据来源,负责数据的生成及相关逻辑处理,视图是模型的外在表现,一个模型可以对应一个或多个视图。视图是应用程序与外界输入的接口。控制器是模型和视图联系的纽带,一方面将外界输入交给模型处理,另一方面又将模型处理好的数据交给视图来表现,使模型和视图同步更新。

在MVC设计模式中,三个层次作用清晰,各司其职,互不干涉,某一层的需求发生变化,只需要修改相应层而不会影响到其他层。同时分层设计也利于组件的重用和功能的扩展,可以很方便的用不同的视圖来显示数据,从而使系统能轻松支持新的逻辑模块和视图显示。因此,在开发中使用MVC设计模式具有显著的优势。

2 MVC模式的实现

使用观察者模式来实现MVC框架。 实现步骤:

(1)定义抽象类Subjecter,持有观察者类的对象。(2)定义抽象类IModel继承Subjecter,作为模型的基类。(3)定义抽象类IView继承Subjecter,作为视图的基类。(4)定义抽象类IController,作为控制器,作为模型和视图之间的纽带,控制器类同时持有模型和视图对象。(5)定义观察者Observer,观察者持有控制器对象。通过以上定义可以看到,模型和视图持有观察者对象,观察者又持有控制器对象,而在控制器又同时持有模型和视图对象。这样一旦模型的数据发生变化就可以通知观察者,观察者使用控制器来通知视图进行更新。而观察者中的控制器和控制器中的视图都是可以方便的更换,从而通过不同的控制器就实现了模型和视图的分离,也就是MVC模式。

3 使用注解进行优化

建立了MVC模式之后,通过继承IModel,IView,IController就可以使用MVC模式来进行开发了,但是在模型里面每多一种变化,相应的在控制器和视图里面就要增加代码来通知视图和响应这种变化,从编程的角度来看这些响应过程其实就是调用视图类相应的方法,在传统的编程中需要先在视图中定义方法,然后在控制器中调用。所以简化的关键是实现动态调用方法。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。由于Java反射机制是基于方法名或变量名的字符串来实现的。可以使用字符串存储视图里面的方法名,然后控制器读取字符串也就是方法名再通过反射来调用相应的方法。注解(Annotation),也叫元数据。可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。注解可以通过反射来获取。这样就可以把模型的变化定义为一个字符串类型的动作,给视图的相应方法加上以这个动作为值的注解,然后在控制器里面读取相应的注解,从而使模型的变化与视图的响应方法自动的对应起来,这样就减少了代码量,更易于使用。

基于上面的思路,首先定义注解:

@Target({ ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

public @interface MVCAction {

String value() default "";

}

注解设定为可以使用在方法上,并且在运行时存在。

接下来的关键就是解析注解,在IView里面编写一个注解解析器,并将解析到的动作名与被该动作所注解的方法的名字一一对应保存在列表中,这样当模型数据发生变化就通过控制器向视图发送动作,在控制里面通过动作得到视图里面的方法名进而通过反射得到对应方法。从而简化了模型,视图及控制器类的定义,通过尽可能的重用代码减小了代码的复杂度,从而达到快速开发的效果。

4 在Android中应用

在很多Android应用场景中,一个完整的应用是由客户端与服务来实现的,这样就可以把客户端当作视图,服务当作模型来使用MVC架构了。但是有很多应用的客户端与服务要运行在不同的进程里面,不能直接使用传统的MVC框架。这时可以把模型分成两部分:客户端的本地模型和服务端的远程模型,本地模型作为远程模型的代理与视图和控制器组成MVC架构。同时本地模型和远程模型通过AIDL接口进行通讯:远程模型把将方法信息和打包后的参数传递给本地模型。(1) 对参数统一化:把任意数量,任意类型的参数打包并实现Parcelable接口以通过AIDL进行传递。(2) 通过AIDL和远程回调实现远程模型和本地模型通讯。这样通过封装的接口和远程回调就可以对用户隐藏本地模型和远程模型之间的联系,从而可以像本地通讯一样在跨进程的应用中使用MVC架构。

5 总结

本文通过观察者模式实现了一个轻量级的MVC框架,并通过反射和注解对框架中的核心部分进行了优化,从而方便使用。并结合Android系统的应用环境进行分析并扩展从而能方便的使用MVC框架。通过在Android应用中使用MVC模式可以使应用结构清晰,可以视图层和模型层分别开发,二者的交互交给MVC框架来完成。同时便于后期维护,在模型层不变的情况下可以任意的更换视图层从而达到快速开发的效果。

参考文献:

[1]闫术卓,杨强.Struts2技术详解:基于WebWork核心的MVC开发与实践[M].电子工业出版社,2008.

[2]李春红,高建华.使用分层模型改进MVC设计架构[J].计算机工程与设计,2007(04).

[3]陈云芳.精通Struts2:基于MVC的JavaWeb应用开发实战[M].人民邮电出版社,2008.

[4]冉春玉,白炳杉.MVC模式及struts框架应用研究[J].武汉理工大学学报.

[5]Bruce Eckel .Thinking in java(java编程思想)第四版[M].北京:机械工业出版社,2011.

[6]刘卫国,姚昱禹.Android的架构与应用开发研究[J].中南大学:信息科学与工程学院计算机系统应用,2008(11):110-112.