5.1 概述
当用例视图在外部用户前出现时,它捕获到系统、子系统或类的行为。它将系统功能划分成对参与者(即系统的理想用户)有用的需求。而交互功能部分被称作用例。用例使用系统与一个或多个参与者之间的一系列消息来描述系统中的交互作用。参与者可以是人,也可以是外部计算机系统和外部进程。图5-1表述了一个电话目录销售的用例视图。此例是实际系统简化后的例子。
图5-1 用例图
5.2 参与者
参与者是与系统、子系统或类发生交互作用的外部用户、进程或其他系统的理想化概念。作为外部用户与系统发生交互作用,这是参与者的特征。在系统的实际运作中,一个实际用户可能对应系统的多个参与者。不同的用户也可以只对应于一个参与者,从而代表同一参与者的不同实例。
每个参与者可以参与一个或多个用例。它通过交换信息与用例发生交互作用(因此也与用例所在的系统或类发生了交互作用),而参与者的内部实现与用例是不相关的,参与者可以被一组定义它的状态的属性充分描述。
参与者可以通过泛化关系来定义,在这种泛化关系中,一个参与者的抽象描述可以被一个或多个具体的参与者所共享。
参与者可以是人、另一个计算机系统或一些可运行的进程。在图中,参与者用一个名字写在下面的小人表示。
5.3 用例
用例是外部可见的一个系统功能单元,这些功能由系统单元所提供,并通过一系列系统单元与一个或多个参与者之间交换的消息所表达。用例的用途是在不揭示系统内部构造的情况下定义连贯的行为。用例的定义包含用例所必需的所有行为—执行用例功能的主线次序、标准行为的不同变形、一般行为下的所有异常情况及其预期反应。从用户角度来看,上述情况很可能是异常情况;从系统角度来看,它们是必须被描述和处理的附加情况。
在模型中,每个用例的执行独立于其他用例,虽然在具体执行一个用例功能时由于用例之间共享对象的缘故可能会造成本用例与其他用例之间有这样或那样的隐含的依赖关系。每一个用例都是一个纵向的功能块,这个功能块的执行会和其他用例的执行发生混杂。
用例的动态执行过程可以用UML的交互作用来说明,可以用状态图、顺序图、合作图或非正式的文字描述来表示。用例功能的执行通过类之间的协作来实现。一个类可以参与多个协作,因此也参与了多个用例。
在系统层,用例表示整个系统对外部用户可见的行为。一个用例就像外部用户可使用的系统操作。然而,它又与操作不同,用例可以在执行过程中持续接受参与者的输入信息。用例也可以被像子系统和独立类这样的小单元所应用。一个内部用例表示了系统的一部分对另一部分呈现出的行为。例如,某个类的用例表示了一个连贯的功能,这个功能是该类提供给系统内其他有特殊作用的类的。一个类可以有多个用例。
用例是对系统一部分功能的逻辑描述,它不是明显的用于系统实现的构件。非但如此,每个用例必须与实现系统的类相映射。用例的行为与类的状态转换和类所定义的操作相对应。只要一个类在系统的实现中充当多重角色,那么它将实现多个用例的一部分功能。设计过程的一部分工作即在不引入混乱的情况下,找出具有明显的多重角色的类,以实现这些角色所涉及的用例功能。用例功能靠类间的协作来实现。
用例除了与其参与者发生关联外,还可以参与系统中的多个关系(如表5-1)。
表5-1 用例之间的关系
如图5-2,用例用一个名字在里面的椭圆表示,用例和与它通信的参与者之间用实线连接。
图5-2 用例之间的关系
虽然每个用例的实例是独立的,但是一个用例可以用其他的更简单的用例来描述。这有点像一个类可以通过继承它的超类并增加附加描述来定义。一个用例可以简单地包含其他用例具有的行为,并把它所包含的用例行为做为自身行为的一部分,这被称作包含关系。在这种情况下,新用例不是初始用例的一个特殊例子,而且不能被初始用例代替。
一个用例也可以被定义为基用例的增量扩展,这叫做扩展关系。同一个基用例的几个扩展用例可以在一起应用。基用例的扩展增加了原有的语义, 此时是本用例而不是扩展用例被作为例子使用。
包含和扩展关系可以用含有关键字<<include>>和<<extend>>的带箭头的虚线表示。包含关系箭头指向被包含的用例,扩展关系箭头指向被扩展的用例。
一个用例也可以被特别列举为一个或多个子用例,这被称做用例泛化。当父用例能够被使用时,任何子用例也可以被使用。
用例泛化与其他泛化关系的表示法相同,都用一个三角箭头从子用例指向父用例。图5-2表示了销售中的用例关系。