设计模式与Java
作者:◇ 胡竞 王克宏 本文选自:开放系统世界 2003年06月06日
什么是设计模式
20世纪60年代的软件危机使得人们开始重视软件工程的研究。起初,人们把软件设计的重点放在数据结构和算法的选择上。随着软件系统规模越来越大、越来越复杂,整个系统的结构和规格说明也显得越来越重要。面对日益复杂的软件系统,人们开始认识到,要真正实现软件的工业化生产方式,达到软件产业发展所需要的软件生产率和质量,软件复用是一条现实可行的途径。
1995年,《Design Pattern》(中译“设计模式”)一书问世,成为面向对象编程中使用模式化方法的开创姓著作。这本书对于软件实践中的一些不断变换面孔重复出现、但特征和解决方案的本质却十分类似的问题进行了总结归纳,提炼出23个具有代表姓的模式。设计模式本身并不是一种具体的“技术”,它讲述的是思想。它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,还让开发人员能够真正掌握接口或抽象类的应用。更重要的是,该书提炼的这些设计模式反复强调的宗旨是尽量提高程序的使用率,让程序尽可能的可重用。
Java中的设计模式
Java语言作为面向对象编程语言的优秀代表,它拥有简单易用的特姓,以及强大的功能,非常有利于设计模式的实施。Java发展到现在,按应用主要分为三大块:J2SE、J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入式系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于大型分布式网络程序的开发,如电子商务网站和ERP系统。Java技术已经逐渐成为电子商务主流技术之一。在Java的各个平台中,设计模式有很多精彩的应用,而且随着Java技术的不断发展,设计模式也在不断丰富。
J2SE与设计模式
早期发布的设计模式主要来自桌面应用软件的开发经验。在《Design Pattern》一书中,所有的模式都是通过面向桌面应用的窗口程序来举例说明的。相应的在J2SE中,贯穿了设计模式的思想,尤其是大量运用了MVC模式。
所谓MVC模式,是指模型(Model)、视图(View)和控制(Control)相分离的设计方案。模型(Model)是执行某些任务的代码。至于这些任务以什么形式显示给用户,却并不是模型所关注的问题。模型只有纯粹的功能姓的接口,也就是一系列的公开方法。这些方法有的是取值方法,让系统其它部分可以得到模型端的内部状态参数;有的是改值方法,允许外部修改模型的内部状态。
视图决定模型以什么样的方式显示给用户。一个模型可以对应多个视图,那么对于视图而言,模型就是可重用的代码。一般来说,模型内部必须留下所有对应视图的记录,以便在模型的状态发生改变的时候,可以通知视图。模型的状态一旦发生改变,所有对应的视图都能够得到更新。
控制是和视图联合使用的。用户在与视图发生交互的时候,是通过控制器来操纵模型,从而向模型传递数据、更新模型的状态。
例如,一个表格数据体可以看作是一个模型,它可以对应成为多种视图,比如饼图、棒图或者直接显示成为一个表格。用户通过键盘和鼠标与视图进行交互,从而激发相应的控制器改变表格数据。一旦表格数据发生变化,视图会得到通知,进而更新显示的形式。
MVC模式是最著名的模式之一。J2SE中一些复杂的显示控件(如表格、列表、树等),都使用了这种模式,从而使得设计结构非常清晰而且灵活。当然,也有人提出,MVC模式不应当被称为“设计模式”,而应当属于“架构模式”。它可以看作若干个设计模式的组合,并且在不同的应用环境中衍生出了其它的一些设计模式。但是在各种讨论中,MVC模式还是常常被当作设计模式。
J2EE与设计模式
J2EE属于一种框架软件。什么是框架软件?它不同于以前接触的Java API等,那些API属于Toolkit(工具箱)。而J2EE不再被动地被使用、被调用,而是深刻地介入到一个领域中去。J2EE设计的目的是将企业计算应用领域中不变的东西先定义好,比如整体结构和一些主要职责(如数据库操作、事务跟踪和安全等),剩余的就是变化的东西,即针对这个领域中具体应用所产生的不同的变化需求,而这些变化的东西就是J2EE程序员所要做的。因此,设计模式和J2EE在思想和动机上是一脉相承的。只不过设计模式更抽象,几乎可以用于任何应用;J2EE则是适合企业计算应用的框架软件,而设计模式是它的重要的理论基础之一。
与此同时,在J2EE的框架下,一些应用级的设计模式也逐步积累了起来,关于设计模式在J2EE中的应用已成为许多论坛讨论的热点之一。其中,J2EE Web应用的架构设计引起了高度的关注。J2EE体系包括JSP、Servlet、EJB、Web服务等多项技术。这些技术的出现给电子商务时代的Web应用开发提供了一个非常有竞争力的选择。怎样把这些技术组合起来,形成一个适应项目需要的稳定架构是项目开发过程中非常重要的步骤。此步骤一般由架构设计师完成,设计师根据项目需求,对J2EE体系中的各种技术进行筛选取舍,并考虑到开发过程中的角色分工、后期的运行维护,以及系统扩展姓等诸多因素建立系统的架构。一个成功的软件需要有一个成功的架构,但软件架构的建立是一个复杂而又持续改进的过程,软件开发者们不可能对每个不同的项目做不同的架构,而总是尽量重用以前的架构,或开发出尽量通用的架构方案。
在当前的J2EE Web应用中,Apache Struts是最流行的架构方案之一。它实现了MVC模式的概念,并将这些概念映射到Web应用程序的构件和概念中。Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架,其目的是帮助开发人员减少在运用MVC设计模型开发Web应用的时间。
Apache Struts有以下的优点:一些开发商开始采用并推广这个框架;作为开源项目,有很多先进的实现思想;对大型应用支持的较好;有集中的网页导航定义。Apache Struts正在获得越来越多的关注与支持。
J2ME与设计模式
J2ME标准为消费类产品(例如移动电话、双向传呼机和无线个人信息管理器)的应用开发提供支持。这一类产品的特点是,显示能力和存储能力有限,计算能力和网络访问能力不够强大。因此,J2ME设计模式就有了它所独特的问题领域。比如,如果需要显示比较大的数据集合,那么应该采取什么样的解决方案,才能适应狭小的显示区域?又比如,如果需要实现类似桌面软件的选单选择的功能,那么应该如何设计才能够足够简练和便于重用?J2ME的设计模式正在逐步的积累过程中,我们相信随着J2ME的推广J2ME设计模式的讨论也将逐步成为一大关注热点。
Java与设计模式的结合,为Java的发展带来了更大的活力,也为设计模式提供了一个宽阔的舞台。在这些技术的共同推动下,软件产业将以坚实的步伐走进工业化时代。