构建面向对象的应用软件系统框架 第11章
第11章 界面设计模式
在设计应用软件系统的界面层的时候,我们同样要考虑界面的可升级性和可维护性。为了达成这个目标,我们同样会使用一些设计模式来使得应用程序界面层的设计更为合理。
11.1 MVC模式
第一个最著名的设计模式就是MVC模式。MVC是三个单词的缩写,这三个单词分别为:模型(Model)、视图(View)和控制(Controller)。
模型-视图-控制器(Model-View-Controller,MVC)模式是一种非常常用的模式,他主要为那些需要为同样的数据提供多个视图的应用程序而设计的。它很好地实现了数据层与表示层的分离,特别适用于开发与用户图形界面有关的应用程序,其示意图见图。
模式中基本结构定义为:
Ø 控制器:用来处理用户命令以及程序事件的;
Ø 模型:维护数据并提供数据访问方法;表示领域信息;
Ø 视图:数据的显示。
在MVC模式的时候,Martin Fowler认为,主要要关注两个分离:从模型中分离表现和从视图中分离控制器。
考察模型和表现的关系,可以得到的结论是,表现依赖于模型,而模型并不依赖于表现。模型的设计,应当能够做到显示独立,也就是说,同样的模型,应当能够支持不同的表现形式。当表现形式发生变化的时候,模型应该无需做改动。
考察一个Excel的例子。同样的一组数据,可以用不同的表现形式来表现。我们看下面的这组数据,这是某个学校的各个年级的人数统计表:
年级 |
一年级 |
二年级 |
三年级 |
四年级 |
五年级 |
六年级 |
人数 |
251 |
233 |
260 |
248 |
228 |
265 |
我们可以用简单的表格形式来表现这组数据,同时,我们也可以使用其他表现形式来表现这组数据,例如,柱状图、饼图,或者其他图形。
在这个例子中,同样的一组数据(模型),可以有多个表现的形式(视图),当用户通过其中的某个视图改变了模型,其他的模型应当也可以随着发生变化。例如,修改了表格中的数字,下面的柱状图和饼状图应该可以同步发生变化。在《设计模式》一书中,提供了一个称为“观察者”(Observer)的设计模式,可以达到这个目的。
同样的,从更大的范围来说,对于相同的业务逻辑,可以使用不同的界面形式,例如,可以分别使用EXE的Windows应用程序客户端,也可以使用Web客户端,甚至手机客户端,而后面连接相同的应用服务器。
我们在设计表现和模型的时候,考虑的关注点是不同的。在设计模型的时候,设计人员更加关注的是业务领域的问题,例如数据的结构、逻辑的处理等等,这需要设计人员对领域有更深的理解,对实现逻辑的技术有更深入的掌握。而在设计表现的时候,设计人员更多的考虑的是界面的布局、界面的友好性以及美观程度等。双方考虑的角度是不同的,对人的技能的要求也是有差别的。
在测试方面,我们可以对模型进行小范围的单元测试,然后,组合进行整个逻辑的测试,这些工作可以在集成开发环境中利用很多测试工具来轻松完成,而界面的测试,则需要更加复杂的工具。
因此,从上面的这些角度来说,从模型中分离表现,是非常重要的。
相比之下,第二个分离,即视图和控制器的分离,就不那么重要了。很多情况下,可以把视图和控制器放在一起,尤其是在一些富客户端的程序中。当然,在基于Web的应用系统中,将视图和控制器分离的做法,是非常常见的。
我们可以通过一个实例来理解MVC模式在开发中的应用。下面我们通过Struts框架来简要的探讨MVC模式在Web开发中的应用。
Struts框架是一个典型的基于JSP的Web层应用框架。在Struts框架中,Model通过Action来实现。在Action中,开发人员添加同逻辑处理相关的代码。如果是一个分布式的系统,实际的业务逻辑代码存在于应用服务层中,那么,Action可以作为一个Web表现层和应用服务层之间的桥梁,一方面将页面的输入转发给应用服务层,另一方面,根据应用服务层处理的结果,请求控制器调用不同的界面进行显示。在数据封装方面,Struts提供了ActionForm,以实现对View和Model之间交互的支持。
View就是JSP页面,页面上的数据封装在FormBean中。在这个方面,Struts框架提供了一整套的标签库来支持更好的编程方式。通过使用这么标签库,可以方便的实现ActionForm和JSP表单之间的映射,完成对数据的封装。
Control部分用于控制页面之间的转换逻辑。这个部分,Struts通过一个ActionServlet来实现。ActionServlet的核心就是Struts-config.xml,Struts-config.xml集中了所有页面的导航定义。对于大型的WEB项目,通过此配置文件即可迅速把握其脉络,这不管是对于前期的开发,还是后期的维护或升级都是大有裨益的。
下面的图显示了Struts框架的整体结构
使用MVC的模式来开发系统,能够很好的划分表现层的功能,这对于带给系统一个更好的结构,使系统更加易于维护有着很好的意义。
除了MVC模式,在界面设计方面,还有一种类似的模式,就是是微软的Document-View模式。Document-View模式在MFC中使用,Document负责保存业务数据,处理业务逻辑,View负责用户界面的显示、用户输入的收集和画面的跳转控制。通过前面的介绍我们可以发现,Document-View模式实际上,几乎就是一个未将视图和控制器分离的MVC模型。这也再次说明一个问题,在某些情况下,尤其是富客户端的程序中,视图和控制器的分离是不那么重要的。
11.2 页面控制器