4.3 依赖关系和实现关系

模型元素之间的依赖关系描述的是它们之间语义上的关系。当两个元素处于依赖关系中时,其中一个元素的改变可能会影响或提供消息给另一个元素,即一个元素以某种形式依赖于另一元素。在UML模型中,元素之间的依赖关系表示某一元素以某种形式依赖于其他元素。从某种意义上说,关联、泛化和实现都属于依赖关系,但是它们都有其特殊的语义,因而被作为独立的关系在建模时使用。

4.3.1 依赖关系

依赖关系用一个一端带有箭头的虚线表示,实际建模时可以使用一个构造型的关键字来区分依赖关系的种类。例如,下图中表示Person类依赖于Computer类。

UML规范中定义了4种基本的依赖类型,它们分别是使用(Usage)依赖、抽象(Abstraction)依赖、授权(Permission)依赖和绑定(Binding)依赖。

1.使用依赖

使用依赖用于表示一种元素使用其他元素提供的服务以实现它的行为,如下表列出了5种经常使用的依赖关系。

在实际建模过程中,上表中的使用依赖最常使用,调用依赖和参数依赖一般很少使用,实例化依赖用于说明依赖元素会创建被依赖元素的实例,发送依赖用于说明依赖元素会把信号发送给被依赖元素。以下3种情况建模需要使用依赖关系。

□ 客户类的操作需要提供者类的参数。

□ 客户类的操作在实现中需要使用提供者类的对象。

□ 客户类的操作返回提供者类型的值。

2.抽象依赖

抽象依赖包括3种:跟踪、精化和派生。它们的具体说明如下。

□ 跟踪(Trace)依赖 用于描述不同模型中元素之间的连接关系,但是没有映射精确。这些模型一般分属于开发过程中的不同阶段。跟踪依赖缺少详细的语义,它主要用来追溯跨模型的系统要求以及跟踪模型中会影响其他模型的模型所发生的变化。

□ 精化(Refine)依赖 用于表示一个概念两种形式之间的关系,这种概念位于不同的开发阶段或者处于不同的抽象层次。这两种形式的概念并不会在最终的模型中共存,其中一个一般是另一个不完善的形式。

□ 派生(Derive)依赖 用于声明一个实例可以从另一个实例导出。

3.授权依赖

授权依赖用于表示一个事物访问另一个事物的能力,被依赖元素通过规定依赖元素的权限,可以控制和限制对其进行访问的方法。常用的授权依赖关系有3种,其具体说明如下表所示。

4.绑定依赖

绑定依赖用于为模板参数提供值,以创建一个新的模型元素,表示绑定依赖的关键字为bind。绑定依赖是具有精确语义的高度结构化的关系,可通过取代模板备份中的参数实现。

UML 2.0中还添加了一个被称作substitution(替代)依赖性的新概念,它是realization依赖性的一种类型,即它是实现类元的另外一种方法。在substitution依赖关系中,作为客户一方的类元取代了作为提供者的类元。在需要对系统进行定制的时候,这种依赖概念尤其好用。如下图所示演示了substitution的使用方法。

上图主要用来预定演出座位,在系统中任何需要订座的地方都可以使用Reservation类来代替ShowSeat类,因此ShowSeat类必须遵从Reservation类确定的接口。

4.3.2 实现关系

实现关系(Realization)用于规定规格说明与其实现之间的关系、它通常用在接口以及实现该接口的类之间,以及用例和实现该用例的协作之间。换种说法来说,实现关系指定两个实体间的一个合同,一个实体定义一个合同,而另一个实体保证履行该合同。使用Java应用程序进行建模时实现关系可直接用implements关键字来表示。

UML中将实现关系表示为末端带有空心三角形的虚线,带有空心三角形的那一端指向被实现元素。除此之外,还可将接口表示为一个小圆圈,并和实现该接口的类用一条线段连接起来。如下图所示演示了一个简单的实现关系。

泛化关系与实现关系是有异同点的,它们都可以将一般描述和具体描述联系起来。但是泛化关系是将同一语义层上的元素连接起来,并且通常在同一模型内,而实现关系则将不同语义层的元素连接起来,并且通常建立在不同的模型内。在不同的发展阶段可能有不同数目的类等级存在,这些类等级的元素通过实现关系联系在一起。