《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > MVC模式在Java多层体系结构中各层模块的运用

MVC模式在Java多层体系结构中各层模块的运用

2009-01-09
作者:王靖文

    今天,软件复用技术已经深入人心,如何提高软件模块的复用程度成为了人们所热心的话题。一个好的模块,要求有很好的灵活性、移植性和扩展性。而在目前的三层应用体系结构下,又该怎样来设计构建一个复用度高的模块才能达到降低开发成本、缩短开发周期的目的呢?我们幸运的发现将经典的MVC模式运用到各层模块的内部划分中,将使得模块的设计也变得清晰简单起来,并能很好的满足模块的灵活性、扩展性等要求,使得模块的可复用程度得到了很大的提高。 

一、关于MVC设计模式 

    MVC模式(Model-View-Controller)最初是在对应用程序进行设计时,总结出来的一个高效的设计模式,它对程序中的各种元素进行抽象归纳,将程序的表示逻辑和业务逻辑分离,使得在设计程序结构时,思路清晰结构明确,也方便以后对表示层进行更改,而对于它和后台业务逻辑的接口也划分清晰,极大的减少了后台业务逻辑变化对前台界面的影响。目前流行的Struts技术就是基于MVC设计模式的Java Web前端应用。 

二、在模块内部设计中引入MVC设计模式的构想 

    实际上,MVC模式同时也为应用程序模块的内部设计提供了一个思路,当对一个模块进行设计时,它所面临的问题是怎样将内部封闭起来,实现某些固定的功能,并对外提供各种可能的接口,能尽量好的与环境融合,同时能够和其他模块进行组装搭配。同时还要能够进行一些扩展,以更好的适应应用程序的环境。为了完成模块的各种功能,保证正确性和灵活性,怎样对模块进行设计和内部划分就变得重要了。而MVC的划分思路正好能很不错的应用于模块的设计之中。 

图1 将MVC模式运用于模块内部设计中 

    MVC中讲求用View层作为表示层面对客户,它负责对外界客户的交互。同样,一个完善的模块也需要一个专门对外的表示层,它专注于为外界各种情况提供接口(可扩展可替换的接口)。它便是模块的View层。向内,它将可能输入的各种参数转化为内部统一的参数形式。向外,它根据配置的环境参数,将要表达的数据转换成符合当前环境特征的数据格式向外表示。外界只能通过它跟模块打交道,它负责了模块内外的联系,并进行模块内外数据格式转换。View层的独立设计使得接口可以即时进行更换和定制,让模块能灵活用于各种不同系统的环境下,这样就能有效的提高模块重用度。 

    而普通MVC中的Model层,要求封装系统的状态,使用一组数据来表示系统的一个状态。同样在模块中,需要将模块内核的数据封装起来作为模块的一个状态。控制层的每一次操作都在读取原状态,进行数据处理,最后再写入新状态,整个过程就是将原状态改变到另一个状态。这样减轻了模块内部的复杂度,方便模块内部的分工。甚至可以说Model就是模块内部的数据池。 

    MVC中的Control层也即控制层,负责响应View层传送过来的请求,它将Model中的数据进行运算,再将结果写回到Model中。同样在模块中,可将实现模块功能的部分作为Control层。因为只有它和核心运算部件打交道,从而来改变模块的状态。它也始终只用模块内部统一的数据格式来与核心部件通讯,而这种数据格式正是在View层根据外界输入的参数生成或转换过来的。 

    通过在模块内部设计中模仿MVC模式,可以使模块的设计清晰化,对模块的各部分可以进行有重点的设计,有利于提高模块的质量和灵活性。由此而产生的应用程序更有强大的生命力。 

三、MVC模式在多层模块设计中的运用 

    对于大型系统程序,分层设计思想是很适合的当前开发的。将应用程序分为几个层次(客户层,应用层,数据层),可使各层着重于各自的重点。而各层模块也可以在分层思想的框架下来进行设计。比较简单的作法就是,从上至下,在每一层都将各自及以下各层组合为一个模块。下面简要介绍在各层组织模块的一些想法。 

图2 MVC模式在多层模块设计中的运用 

 

    在客户层,我们可以将客户层和下面的各层合在一起看作一个模块。下层的模块可视为本层模块中的子模块。若在该层采用Struts技术将使得整个结构非常清晰。在该层的模块化可以这样进行:模块的View层采用JSP和Java Servlet来定制,运用JSTL和Struts标签库技术,使得表达更加灵活。甚至可以使用自定义标签来扩展JSP功能,比如可以生成饼状图等各种统计图形。对于客户层模块中的Model,Struts框架提供了很好的ActionForm。它可以使用自己定制的JavaBean,也可以由Struts框架根据配置动态生成的ActionForm。View层将一切收集到的数据都放入ActionForm中,然后通知控制层来处理数据。Struts框架在Control层使用ActionServlet来对数据处理进行控制的。当然在客户层的数据处理更多的是对数据格式的转化,对数据的整理封装,然后通知它的核心运算部件(即应用层的模块)来进行运算处理。 

    在应用层,同样将应用层和下面的数据层组合在一起成为一个模块。在这一模块中它的View层由Action充当,它负责对外进行数据的表达和传递。而模块中对数据进行保存和传递的Model可以由值对象VO来充当,它负责封装view层的数据然后交由控制层处理。而控制层中实现业务逻辑的控制类也是将数据写入值对象VO后,交由view层来向外界表达的。 

    在数据层,它的模块独立性更强。在该层的view层,将数据转化为直接跟存储有关系的数据,交由控制层来处理。这一个功能可由各自的DAO来完成,它们各自将数据转换为统一的ObjectDAO能操作的数据格式(比如封装了SQL语句以及其他指令和结果的一个数据包),然后统一调用一个实际与数据库进行交互的代理ObjectDAO。而这个代理就充当了模块的Control层。它负责最终调用数据库操作来改变数据,改变模块的状态。 

四、结束语 

    作为一个拥高复用程度的模块,它的要求是能尽量广泛的用在各种环境下,能以最小的代价自适应环境,保证模块能正确的完成外界交给的任务。用于应用程序层次设计的MVC思想正好为模块内部的设计提供了一个很不错的想法,即控制和数据分开的思想,将模块内部中逻辑处理和数据封装分开来设计。这样简化了内部设计的难度,也提高了模块的灵活性进而提高了模块的复用度。MVC的思想往往能为复杂的任务提供清晰的设计方案。所以我们应该在程序设计中多借鉴它的思想,往往能设计出清晰简单的方案。 

参考文献: 

1.       Chuck Cavaness  《Programming Jakarta Struts》 O'Reilly 2002.11  

2.       CT Arrington 著 《Enterprise Java with UML 》中文版  机械工业出版社 2003.7 

3.       Ivar Jacobson,Martin Griss,Patrik Jonsson 《Software Reuse Architecture,Process and Organization for Business Success》 机械工业出版社 2003.1 

4.       James Turner, Kevin Bedell 《Struts Kick Start》 Sams Publishing 2002.11 

5.       William Crawford, Jonathan Kaplan  《J2EE Design Patterns》  O'Reilly 2003.9 

6.       J2EE Specification,http://java.sun.com  

7.       XML Specification,http://www.w3.org 

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。