用例泛化关系

      用例泛化关系是指一种从子用例到父用例的关系,它指定了子用例如何特化父用例的所有行为和特征。

      父用例可以特化形成一个或多个子用例,这些子用例代表了父用例比较特殊的形式。尽管在大多数情况下父用例是抽象的,但无论是父用例还是子用例这两者都不要求一定是抽象的。子用例继承父用例的所有结构、行为和关系。同一父用例的子用例都是该父用例的特例。这就是可适用于用例的泛化关系(另请参阅指南:泛化关系)。

      当您发现两个或更多用例在行为、结构和目的方面存在共性时,就可以使用泛化关系。这种情况发生时,您可以用一个新的、通常也是抽象的用例来描述这些共有部分,该用例随后被子用例特化。

      示例:

“电话订购”和“Internet 订购”用例都是抽象用例“订购”的特例。

      在订单管理系统中,“电话订购”和“Internet 订购”两个用例在结构和行为上存在很多的共同点。而一般用例“订购”是根据结构和公有行为的定义来定义的。虽然抽象用例“订购”本身无须完整,但是它提供了一个大体的、通过子用例进行完善的行为框架

      父用例并不总是抽象的。

      示例:

      考虑在上一示例中的订单管理系统。假设要增加一个订单登记员主角,该订单登记员可以代表客户将订单输入到系统内。此主角将启动一般的“订购”用例,此时必须要有一个完整的事件流来说明该用例。子用例可以在父用例提供的结构上添加行为,也可以修改父用例中的行为。

订单登记员主角可以将该一般的“订购”用例实例化。“订购”用例还可以被“电话订购”或“Internet 订购”用例所特化。

      子用例依赖于父用例的结构(请参阅指南:用例,关于事件流结构的讨论)。子用例可以将附加行为添加到父用例中,方法是将行为段插入到被继承行为中或者声明对子用例的包含关系扩展关系。虽然子用例可以从父用例继承行为段,但是必须慎重修改,以便保持父用例的使用目的。父用例的结构由子用例保持。这意味着尽管所有行为段(即父用例事件流的步骤或分支流)仍然必须存在,但是这些行为段的内容可以被子用例修改。

      如果父用例为抽象用例,则它可以具有不完整的行为段。但是,子用例必须补充完善这些行为段,并使得它们对于主角而言是有意义的。

      如果父用例是一个抽象用例,则它无需与主角发生关系。

      如果两个子用例都对同一父用例(或基本用例)进行特化,则二者之间的特化是相互独立的,这意味着它们可以在各自独立的用例实例中执行。这与包含关系和扩展关系不同。在包含和扩展关系中,一些附加用例隐式或显式地修改了执行相同基本用例的一个用例实例。

      用例泛化关系和包含关系都可以用来复用该模型用例间的行为。二者的区别是,在用例泛化关系中,执行子用例不受父用例的结构和行为(复用部分)的影响;而在包含关系内,执行基本用例只依赖包含用例(复用部分)执行有关功能的结果。另一个区别是,在泛化关系中,子用例有相似的目的和结构;而在包含关系中,复用相同包含用例的基本用例在目的上可以完全不同,但是它们需要执行相同的功能。

一、执行用例泛化关系

      执行子用例的用例实例将遵循父用例的事件流,同时插入附加行为或修改在子用例事件流中定义的行为。

用例实例遵循父用例,而行为按子用例中的说明插入或进行修改。

二、描述用例泛化关系

      通常,您可以不用描述泛化关系本身。相反,在子用例事件流中,您必须指定如何将新步骤插入到继承行为中以及如何修改继承行为。

如果子用例特化不止一个的父用例(多继承),则必须在子用例的规约中明确说明父用例的行为序列如何在子用例中交替执行。

三、使用示例

      对于一个简单电话系统的两个用例,可考虑以下分步概述:

      拨打本地电话

      1 呼叫方拿起听筒。
      2 系统发出拨号音。
      3 呼叫方拨打一位数字。
      4 系统结束拨号音。
      5 呼叫方输入电话号码的其余数字。
      6 系统分析该号码。
      7 系统找到相应的当事人。
      8 系统连接相应的当事人。
      9 当事人之间断开连接。

      拨打长途电话

      1 呼叫方拿起听筒。
      2 系统发出拨号音。
      3 呼叫方拨打一位数字。
      4 系统结束拨号音。
      5 呼叫方输入电话号码的其余数字。
      6 系统分析该号码。
      7 系统将号码发送到其他系统。 
      8 系统连接该线路。
      9 当事人之间断开连接。

      在这两个用例中,使用蓝色的文本部分是非常相似的。当这两个用例是如此相似时,我们应该考虑将它们合二为一。其中,其他分支流显示了拨打本地电话和拨打长途电话之间的差别。

      然而,如果它们之间存在某些重大的差别,而且有一个值指明了该用例模型中本地电话和长途电话之间的关系,那么我们就可以提取它们之间的公有行为,组成一个新的、更一般的用例即“拨打电话”用例。

      在用例图中,已创建的泛化关系如下图所示:

“拨打本地电话”用例和“拨打长途电话”用例都继承了“拨打电话”抽象用例的公有行为。
© 1987 - 2001 Rational Software Corporation。版权所有。

中程在线