摘要:
软件模式,特别是设计模式在现今的软件开发中越来越重要。在许多的标准,工具,以及开发方法中都引入了模式的概念。本文介绍了如何在UML中对软件模式进行建模,并结合具体的工具Rational XDE,对如何定义,如何应用模式作了详细地介绍,并指出了一些相关的问题。
第一部分:模式的UML表示
1.1 软件模式
软件模式(Software Pattern)的概念由来已久,当初软件业从建筑业等其他的工程行业中汲取模式的概念,并把它演化成为软件模式的时候,无疑的是软件工程领域中一项革命的成果。而GoF对设计模式的分类与描述,更使得模式这一概念具体入微,能够被成熟的应用在软件开发之中。
所谓模式,简单而言,是一种针对某一特定的,反复出现的问题的成功的解决方案。就问题本身而言,可以使任意领域和范畴的。在诸如建筑,音乐,写作,管理等等领域中,都有模式的概念存在。在软件领域中,模式被以一种约定的文档形式表现出来,以便于纪录,学习和交流。经验丰富的程序员,可以将他们的知识,通过模式这种更形式化的东西,传递给别人。因而,模式可以看作是一种具体化的,文档化的经验和知识。
在将近十年的时间里,软件模式的有了很大的发展,它不仅仅只是一种经验的表达,现在已经能够作为程序开发的一种驱动力了。模式驱动的软件开发过程(Pattern Based Development),已经不是一种新事物。但是,在今天的软件开发领域中,一个开发思想,或者过程,如果没有一种强有力的工具支持,它就很难得到广泛的应用。
软件模式,就其抽象的级别,可以分为体系结构模式,设计模式和Idiom三种。
1、体系结构模式:提供对体系结构设计中所遇到的问题的解决方案。体系结构的例子包括有:Pipe-Filter模式,白板模式,MVC模式,ORB模式等等。体系结构模式并不一定是面向对象的,它的思想可以为任何开发方法所使用。因而,在利用UML进行描述的时候会有一些困难,而通常使用一些特定专有的描述方法,比如C2(Component-Connector)等。对它的工具支持比较的少,现在大多数尚处于研究阶段。
2、设计模式:提供对面向对象的具体设计中的问题的解决方案,使得设计的结果更具有良好的可扩展性和重用性。通常所说的设计模式,是指的GoF一书中所分类的好了的23个模式。设计模式更具其设计功用,被分为构建型,结构型和行为型三类,包括桥接模式,工厂模式,组合模式等等。对这些模式的描述以及工具支持已经比较成熟。现在已经出现了一些支持设计模式的CASE工具,比如TogetherJ,Rational XDE等。其中以XDE对模式的支持最好。本文将在后面的文章中就XDE中的模式开发展开讨论。
3、习惯用法(Idiom):是针对具体语言的使用模式。主要涉及的问题是,如何用特定方法来解决程序代码编写过程中所遇到的问题,如何更优的编写程序代码。通常一种语言,比如Java,C++等,都会有相应的Idiom。这种模式的抽象层次比较低,且涉及到具体的语言,在这儿不予过多的讨论。
1.2 UML的模式机制--协作,参数化协作
在早期的UML中,并没有提供对模式的支持。而随着模式的日益普及,OMG也终于在新版的UML引入了新的概念来提供对模式建模(主要是设计模式)的支持。
稍稍熟悉UML的人,会对协作图(Collaboration Diagram)的非常地了解,协作图是UML的9大视图之一,主要用来提供对模型的动态描述。
而协作(Collaboration)的概念同协作图其实并不太一样。在面向对象的模型中,一个特定的行为,是由一组对象以及对象之间的消息传递来实现的。这种模型信息就是由协作来表示。协作描叙了在一定的语境中一组对象以及用以实现特定行为的这些对象之间的相互作用。它包含结构和行为两个方面,结构方面与静态视图相似,包含一个对象(更为确切的说应该是角色)的集合和他们之间的关系。行为方面是一个消息的集合,这些消息在具有某一角色的各对象之间进行传递交换,也就是所谓的交互(Interaction)。协作的静态方面可以用类图来表示,协作图实际上也给出了一些静态的模型信息,而动态方面的描述通常使用顺序图(Sequence Diagram)或者协作图来表示。
从这个角度来看,模式就是一种协作。对设计模式而言,它实质上描述的就是对象的结构以及对象之间的交互--并应用这样的一种协作来解决某一个问题。在UML中,模式使用的是一种特殊的协作,参数化的协作(parameterized collaboration)来表示的。
在一个参数化的协作中,协作的参与者(比如类,也可以是关系等其它元素)可以是一个泛化的协作的参数。每当应用这个协作到一个具体的模型中去的时候,用具体的模型元素来替代这些参数。这样,在这个协作中参数之间的关系就被固定在这个模型中了。虽然对设计模式而言,它包含了比协作更多的含义。但是这样的一种参数化协作的建模方式,已经能够描述模式大部分的语义信息。模式还可以包括使用背景,使用指导,以及使用后果等其他的描述,这些内容可以作为注释写在单独的文本文件中。