为什么要用用例图

通常,软件系统的用户数量庞大(或用户的类型很多),每个用户只知道自己如何使用系统,但是没有人准确的知道系统的整体运行情况。因此,使用用例模型替代传统的功能说明,往往能够更好的获取用户需求,它所回答的问题是“系统应该为每个(或每个类)用户做什么”。

用例模型描述的是外部行为者所理解的系统功能。用例模型的建立是系统开发者和用户反复讨论的结果,它描述了开发者和用户对需求规格所达成的共识。

用例图有哪些元素

一副用例图包含的模型元素有系统、行为者、用例及用例之间的关系。如图一是自动售货机系统的用例。图中方框代表系统,椭圆代表用例(售货、供货和取存款是自动售货机系统的经典用例),火柴人代表行为者,它们之间的连线表示关系。 


用java写自动售货机的程序 自动售货机uml用例图_intellij-idea

图一(自动售货机系统用例图)

【1】系统 

系统被看作是一个提供用例的黑盒子,内部如何工作、用例如何实现,这些对于建立用例模型都是不重要的。

代表系统的方框的边线表示系统的边界,用于划定系统的功能范围,定义了系统所具有的功能。描述该系统功能的用例至于方框内,代表外部实体的行为者至于方框外。

【2】用例

一个用例是可以被行为者感受到的、系统的一个完整的功能。在UML中把用例定义成系统完成的一系列动作,动作的结果能被特定的行为者观察到。这些动作除了完成系统内部的计算与工作外,还包括与一些行为者的通信。用例通过关联与行为者连接,关联指出一个用例与哪些行为者交互,这种交互是双向的。

用例具有下述特征:

  1. 用例代表某些用户可见的功能,实现一个具体的用户目标
  2. 用例总是被行为者启动的,并向行为者提供可识别的值
  3. 用例必须是完整的

注意,用例是一个类,它代表一类功能而不是使用该功能的某个具体实例。用例的实例是系统的一种实际使用方法,通常把用例的实例称位脚本。脚本是系统的一次具体执行过程,例如,在自动售货机系统中,张三投入硬币购买矿泉水,系统收到钱后把矿泉水送出来,上述过程就是一个脚本;李四投币买可乐,但是可乐以及卖光了,于是系统给出提示信息并把钱退给李四,这个过程是另一个脚本。

 【3】行为者

行为者是指与系统交互的人或其他系统,它代表外部实体。使用用例并且与系统交互的任何人或物都是行为者。

行为者代表一种角色,而不是某个具体的人或物。例如,在自动售货机系统中,使用售货功能的人既可以是张三(买矿泉水)也可以是李四(买可乐),但是不能把张三或李四这样的个体对象称为行为者。事实上,一个具体的人可以充当多种不同角色。例如,某个人既可以为售货机添加商品(执行供货功能),又可以把售货机中的钱取走(执行取货款功能)。

在用例图中用直线连接行为者和用例,表示两者之间交换信息,称为通信联系。行为者触发(激活)用例,并与用例交换信息。单个行为者可与多个用例联系;反之,一个用例也可与多个行为者联系。对于同一个用例而言,不同行为者起的作用也不同。可以把行为者分成主行为者和副行为者,还可分成主动行为者和被动行为者。
实践表明,行为者对确定用例是非常有用的。面对一个大型、复杂的系统,要列出用例清单往往很困难,可以先列出行为者清单,再针对每个行为者列出它的用例。这样做可以比较容易地建立起用例模型。

【4】用例之间的关系

UML用例之间主要有扩展和使用两种关系,它们是泛化关系的两种不同形式。

(1)扩展关系

向一个用例中添加一些动作后构成了另一个用例,这两个用例之间的关系就是扩展关系,后者继承前者的一些行为,通常把后者称为扩展用例。例如,在自动售货机系统中售货”是一个基本的用例如果顾客购买罐装饮料,售货功能完成得很顺利,但是,如果客要购买用纸杯装的散装饮料,则不能执行该用例提供的常规动作,而要做些改动。人们可以修改售货用例,使之既能提供售罐装饮料的常规动作又能提供售散装饮料的非常规动作,但是,这将把该用例与一些特殊的判断和逻辑混杂在一起,使正常的流程晦涩难懂。图二中把常规动作放在“售货”用例中,而把非常规动作放置于“售散装饮料”用例中,这两个用例之间的关系就是扩展关系。在用例图中,用例之间的扩展关系图示为带版类《扩展》的泛化关系。

(2)使用关系

当一个用例使用另一个用例时,这两个用例之间就构成了使用关系。一般说来,如果在若干个用例中有某些相同的动作,则可以把这些相同的动作提取出来单独构成一个用例(称为抽象用例)。这样,当某个用例使用该抽象用例时,就好像这个用例包含了抽象用例中的所有动作。例如,在自动售货机系统中,“供货”和“取货款”这两个用例的开始动作都是去掉机器保险并打开它,而最后的动作都是关上机器并加上保险,可以从这两个用例中把开始的动作抽象成“打开机器”用例,把最后的动作抽象成“关闭机器”用例。于是,“供货”和“取货款”用例在执行时必须使用上述的两个抽象用例,它们之间便构成了使用关系。在用例图中,用例之间的使用关系用带版类《使用》的泛化关系表示,如图


用java写自动售货机的程序 自动售货机uml用例图_idea_02

图二  含扩展和使用关系的用例图

注意扩展与使用之间的异同:这两种关系都意味着从几个用例中抽取那些公共的行为并放人一个单独的用例中,而这个用例被其他用例使用或扩展,但是,使用和扩展的目的是不同的。通常在描述一般行为的变化时采用扩展关系;在两个或多个用例中出现重复描述又想避免这种重复时,可以采用使用关系。