设计模式在软件复用中的应用摘要:软件规模和复杂度的不断增加,使得软件开发面临着前所未有的挑战。软件的复用被视为解决软件危机,提高软件生产率和质量的有效途径。设计模式在软件设计的应用体现在使软件具有分层结构,使得软件更稳定,更完善,而且各个层次相互独立,任何一层的改动不会影响其他层次。因此增强了软件的灵活性、稳定性和可扩展性,软件的复用是一种更抽象、更有效、使用范围更广的复用,并且在实际的操作中更加切实可行。关键词:软件危机;设计模式;软件复用;构件技术;CBD1.引言从20世纪60年代开始,计算机硬件技术的快速发展,计算机的容量、速度和可考性得到明显的提高,而生产计算机硬件的成本却不断下降。这为十算机更广泛的应用提供了有利的条件。随之各种复杂的、大型软件项目被提出来。但是随着软件系统规模的扩大和复杂性的增长,软件开发所耗费的入力、物力也发生了惊人地增加,两软件系统的可靠性和可维护性却明显下降,软件业出现了危机。于是于1968年Mcllroy在NATO软件工程会议上首次提出了软件复用的思想。入们逐渐认识到要摆脱这场危机,真正实现软件的工业化生产方式,提高软件的开发效率和质量,软件复用是一条现实可行的途径。2.软件复用理论与技术2.1软件复用定义与概述及关键因素软件复用是一种由预先构造好的、为复用目的而设计的软件构件来建立或者组装软件系统的过程。它的基本思想非常简单,即放弃那种原始、一切从头开始的软件开发方式,而是利用复用技术,由公共的可复用构件来组装新的系统,这些可复用构件包括对象类、框架类或者软件体系结构等。软件复用的益处最主要、最明显的是提高软件生产率,并降低软件生产的代价,第二个明显的有点是提高软件的质量。其它的方面的益处还有:使用相同的软件(特别是用户界面软件)的系统将对用户体现较多的一致性,并具有较好的互操作性;推动标准化工作,使软件体系结构,算法乃至开发过程等方面趋于一致。软件复用强调的是复用的目的,它是一种系统化的方法,为了复用而进行设计,为了复用而开发,并且要有效地组织和管理这些复用产品,方便人们查找和使用,基于复用产品进行开发。由此可见,并非所有重复使用软件的行为都是软件复用过程,例如:重复使用并非为了复用目的而设计的软件或在一个应用系统的不同版本间重复使用代码,这两类行为都不属于严格意思上的软件复用。软件复用有三个基本问题:一是可以复用的对象;二是所复用对象必须是有用的;三是复用者需要知道如何去使用被复用的对象。实现软件复用的关键因素主要包括:软件构件技术、领域工程、软件构架、软件再工程、开放系统、软件过程、CASE技术等以及各种非技术因素。实现软件复用的各种技术和非技术因素是相互联系的,它们结合在一起,共同影响软件复用的实现。2.2构件技术构件技术是支持软件复用的核心技术。构件是指应用系统中可以明确辨识的构成成分,它是一个组合的单位,包括合同化声明的接口和明确说明的上下文相关性。一个构件可以被独立地部署且服务于第三方所做的组合。面向对象技术中对象概念的提出与发展,为软件构件的产生奠定了理论基础。构件技术以面向对象技术为基础,并很好地发展了面向对象技术。构件技术的目的是将对象封装成一个规范的、标准的、可以方便地被构件容器所操纵和使用的整体,使其成为一个通用、高效的软件部件。可复用构件指具有相对独立的功能和可复用价值的构件。构件的最小粒度为单个的类和模块。可复用构件应具备如下的属性:(l)有用性:构件必须提供有用的功能;(2)可用性:构件必须易于理解和使用:(3)质量:构件及其变形必须能够正确工作;(4)适应性:构件应易于通过参数化等方式在不同语境中进行配置;(5)可移植性:构件应能在不同的软硬件平台下工作。2.3CBD及其特点CBD即基于构件的软件开发,是软件工程技术和面向对象技术发展到一定程度的产物。在CBD的概念中有两个基本思想:首先,如果应用由己有构件进行装配、组合而成,则开发的效率会大大提高;其次,可以通过某些渠道获得大量的构件,不论是通用的构件还是某一领域专用的构件。由此可以看出,CBD的初衷是为了提高软件的复用性,从而满足软件应用开发过程中不断增加的对于低成本、短周期、高质量、个性化的需求,使得动态的、竞争激烈的、全球化的软件应用开发进入现代化工业生产。3.设计模式理论基础3.1设计模式的起源工程学科中的一大原则是总结经验和利用实践证明有效的方案。经验是可以复用的,有助于更快、更顺利的建立良好的方案。从而节约成本、提高质量。为了描述经验,模式已成为收集、规范和分析特定场景中常见的问题的解决方案(即经验)的有效方法。模式的研究起源于建筑工程设计大师ChristopherAlexander的关于城市规划和建筑设计的著作。他认为:“每一种模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案,而不必重复劳动。”尽管他的著作是针对城市规划和建筑设计的,但是其观点实际上适用于所有的工程设计领域。软件界借鉴了其中关于模式的思想。软件模式在软件界中的出现始于1987年。模式的核心思想是总结和积累前人在软件开发过程中成功的设计经验,通过对这些经验的学习,使得人们在面对新的软件设计问题时不必一切都从头开始,而可以尽量采用已有的模式以提高软件的生产效率。3.2设计模式的基本概念及分类Alexander的模式思想同样适用于面向对象设计模式,只是在面向对象的解决方案里,用对象和接口代替了城市和建筑模式中的墙壁和门窗。两类模式的核心都在于提供了相关问题的解决方案。设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。一个设计模式命名、抽象和确定了一个通用设计结构的主要方面,这些设计结构能被用来构造可复用的面向对象设计。设计模式确定了所包含的类和实例、它们的角色、协作方式以及职责分配。可以根据两条准则对设计模式进行分类,即目的准则和范围准则。目的准则是指设计模式是用来完成什么工作的。范围准则是指对应设计模式主要是用于类还是用于对象。根据目的准则,设计模式可以分为如下几类:(l)创建型设计模式:与类或对象的创建有关;(2)结构型设计模式:处理类或对象的组合;(3)行为型设计模式:对类或对象怎样交互和怎样分配职责进行描述。根据范围准则,设计模式可以分为:(l)类设计模式:处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻就被确定下来。(2)对象设计模式:处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性。3.3设计模式的作用设计模式的思想是描述一个不断重复出现的问题以及对该问题的核心解决方案,它是成功的构架、设计及实施方案的反映,也是经验的总结。模式是经过时间和应用领域考验过的某些问题的解决方案,这些问题已经被经验丰富的设计师、开发者和语言专家所解决。(l)设计模式是经过证实的:设计模式反映了开发者的经验、知识和洞察力,开发者曾成功地使用过这些设计模式。模式有助于管理软件的复杂度。每个模式描述一种用来处理所关注问题的己证明是可行的办法。(2)设计模式是可复用的:设计模式提供了一个现成的解决方案,可根据需要适应不同的问题,可帮助设计者更快、更好地完成系统的设计:同时,设计模式帮助系统设计者做出有利于系统复用的选择,避免设计损害了系统的复用性。为了能够应对不断变化的需求,软件系统需要有可伸缩性和可扩展性,以适应这种需求变化。(3)设计模式是有表现力的:设计模式提供了一个公共的解决方案的词汇表,可用来简洁地表达解决方案,也会使新的系统开发者更加容易理解其设计思路。模式为设计原则提供一种公共的词汇和理解。(4)在面向对象的编程中,软件编程人员更加注重以往代码的复用性和可维护性。通过提供一个类和对象作用关系以及它们之间的潜在联系的说明规范,设计模式甚至能够提高已有系统的文档管理和系统维护的有效性。设计模式在软件复用中的应用研究(5)模式是一种为软件体系结构建立文档的手段。设计一个软件系统时,根据这些模式可以描述出一个构想。这就避免了在扩展和修改初始体系结构时,或者在修改系统代码时,违背这个最初的构想。(6)模式帮助开发人员站在最高层次的视角看待问题域。对于问题分析、设计和面向对象,模式的应用可使开发者不必过早地去处理程序细节,而是从系统的设计框架开始逐步细化。(7)模式的介绍中包括了问题域和解决域的双重界定,即既讲解了“为什么”,又讲解了“怎么办”。设计模式的适用性、效果和实现部分都会帮助指导使用者做出各种必要的设计决定。4.设计模式在软件复用中的应用4.1CBD的不足CBD以构件为单位独立地进行设计和实现,提高了应用系统各部分开发的独立性,是长期以来主流的复用技术。但是,实际操作起来,在CBD的整个过程及构件的开发、寻找和使用阶段必须要解决一些技术上面的问题,实际上,基于构件的开发并未真正实现其最初的“复用和灵活性”的承诺。并非很多的构件可以真正复用。一些因素阻碍了CBD的发展:(l)构件在实际应用中的变化性。一些开发者开发的构件,要做到在被另一些人开发的系统中使用时正好合适,且从内容到对外接口都基本相符,这不是一件容易的事。多数构件在应用时都有其局限性,需要对其修改以适应新系统,这背离了黑盒复用的愿望。而且,构件的这种变化性需要在系统中加以实现才能真正实现软件复用。(2)构件的发展还处于不完善阶段,多数构件的应用还是仅仅局限于代码复用或模块复用,而越来越多的大规模软件开发项目要求更高层次的复用。(3)构件要达到一定的数量,才能支持有效的复用,而大量构件的获得需要有很高的投入和长期的积累。(4)目前的构件规范说明还不完整,没有形成统一规范标准,这给使用者理解和抽取构件以及对构件库的管理带来了一定的难度。(5)CBD的研究需要一些新的理论、技术和环境的支持,而目前这方面的研究成果和实践经验尚不够充分。虽然在CBD的实际应用过程中,存在一些不太现实或者目前看来不够成熟的地方,不过,它仍然是目前比较流行的软件复用技术,是一种构建灵活系统的开发方法。因此,在实际的应用中,可以借鉴CBD中优秀的地方,对其不足之处加以改进,从而使其更好地实现复用的目的。4.2基于设计模式的CBD模型基于设计模式对软件复用的支持,为了发挥CBD的长处而摒弃CBD的不足,本文提出了一种改进的CBD模型,在该模型中引用了设计模式,其过程模型如图4.1所示。图4.1应用设计模式的CBD过程模型在该过程模型中,应用设计模式进行构件开发主要依据了以下思想:(l)根据应用领域的特定应用需求(功能分析),划分功能模块;(2)进一步识别/提取出构件;(3)根据系统体系结构,对照经典设计模式,进行实际的构件开发(实现各个功能模块);(4)根据实际的业务模型和可参照的设计模式,对构件的可变性进行实现,组合、部署开发更合适的构件,最终实现整个系统。在基于设计模式的复用中,设计模式系统的地位是至关重要的,它决定了应用系统的设计是否合理、实现是否灵活、效果是否理想。在采用设计模式的时候,实际上是把可能变化的部分进行了封装,把其中变化的和不变的部分进行解藕,利用接口或者抽象类并参照某种设计模式进行设计。软件复用规则的基本思想实际上也是尽量减少不同类之间的耦合度,以便封装变化。因此,获得软件复用的关键是对系统变化具有可预见性。这要求在应用研究中尽可能地去预见软件的变化,并且把这种可能发生的变化封装起来,这实际上是许多模式的主题,也是进行软件复用的主题。因此,设计模式体现的总体设计的思想应当贯穿整个过程的始终,也就是说要依据设计模式设计并实现相应的构件。4.3设计模式的选取4.3.1设计模式的选取方法Alexander提出了模式选择的方法虽然不是针对软件设计的,但在软件领域仍然是可以借鉴的。GoF总结了23种设计面向对象软件的设计模式,这些模式可以帮助设计者更快更好地完成面向对象的软件设计。在实际应用中,可根据实际情况进行正确的模式选择。随着对设计模式研究的广泛开展和不断深入,越来越多的模式被发现,但它们都是基于对传统设计模式的改进的。选择模式应对所有设计模式有较深的理解和掌握,并且