UML九种图之用例图

    在UML中有九种需要我们掌握的图,即用例图、类图、对象图、包图、时序图、协作图、状态图、活动图已经组件图和配置图。其中的包图可以看做是类图的一个集合。用例图是这九种图中的第一个,也是我认为尤为重要的一个。
    一、什么是用例图
    用例图是用来描述用户需求的,他是从用户的角度去看这个系统的功能,从而找到与之对应的角色。
    二、用例图的基本元素
    UML中的用例图描述了一组用例、角色已经它们之间的关系,因此用例图包括三种基本元素,即用例,角色和关系。
    1、用例
        用例是对一个系统或一个应用的一种单一的使用方式所做的描述,是关於单个活动者在与系统对话中所执行的处理行为的陈述序列。用例是对系统的用户需求的描述,它表达了系统的功能和所提供的服务。用户描述活动者与系统交互中的对话,用来描述角色使用系统完成某个事件时的事情发展顺序。这样的定义是不是有点让我们云里雾里呢,其实,用例就是一个角色它在这个系统中的功能。用户的需求会有很多个,每个角色要实现的功能也可能不只一个,那么用例就可能会有多个。在图形上,用例用一个椭圆来表示。
         
 图1(用例)
        需要注意的是,每个用例都必须有一个唯一的名字以区别于其他用力。
    2、角色
         上面关于“什么是用例图”中提到角色一词,那么什么是角色呢。在我们日常生活中对角色一词并不陌生,我们经常会谈了某个明星又饰演了一个什么什么角色,我们在生活中也扮演着子女,学生等角色。这些确确实实是角色,但我们上面提到的角色他们本体都是人,而在UML中我们说的角色不仅仅可以是直接使用人员、维护人员等的人,还可以是使用的外设、需要和该系统相连的其他系统等的物。有些资料上所说的参与者其实就是角色。一句话,角色就是系统外部的一个实体,这个实体可以是任何的人或事物,它以某种方式参与了用例的执行过程。

图2(角色/参与者)
    3、关系
         用例图中的关系包括参与者、用例之间的关系,泛化关系、包含关系、扩展关系等。
         1.关联关系(参与者与用例间的关系)
          参与者与用例之间的关系通常用关联关系来描述。所谓的关联关系即两者之间的联系。使用关联关系只能说明两者之间存在关系,但无法确切的指明是什么关系,任何一种关系都可以用关联关系来代替,所以说能用其他关系的时候就尽量不要用关联关系。关联关系使用带箭头的实线来表示。

    图3(关联)

         2.泛化关系
          在用例图中,使用了泛化关系来描述多个参与者之间的公共行为。这里的泛化其实与我们之间学过的继承很类似,但又有不同。继承是从父类到子类,从一般到特殊,而泛化则是从子类到父类,即从特殊到一般。但在我们实际使用的时候这两者是没有什么区别的。所以就直接把泛化看做是继承就可以了。在一个系统中,如果几个角色/参与者具有共同的部分那么就可以使用泛化关系来描述他们。此外,泛化关系不仅可以用在角色之间也可以用在用例之间。

图4(泛化)

图5(参与者间的泛化关系)

图6(用例间的泛化关系)
         3.包含关系
           包含指的是其中一个用例(称作基础用例)的行为包含了另一个用例(称作包含用例)的行为。基础用例可以看到包含用例,并依赖于包含用例的执行结果。但是二者不能访问对方的属性。即如果要完成一个功能就需要用到另一个功能,那么这两个功能之间就存在包含关系。包含关系使一个用例的功能可以在另一个用例中使用,通常在以下两种情况下发生:
           1.如果两个以上用例有重复的功能,则可以将重复的功能分解到另一个用例中。其他用例可以和这个用例建立包含关系。
           2.一个用例的功能太多时,可以用包含关系创建多个子用例。

图7(包含)

    图8(包含关系)
      4.扩展关系
        一个用例可以被定义为基础用例的增量扩展,这称作扩展关系。扩展关系是把新行为插入到已有用例的方法。它为处理异常或构件灵活系统扩建提供了一种有效的方法。基础用例不必知道扩展用例的任何细节,它仅为其提供扩展点。需要知道的是,基础用例本身就是完整的。举个例子,在我们自考报名之后需要查询我们的考生信息,在考试的一两个月时我们可以只单纯的查看即可,但到要考试的前两天我们就需要将其打印出来了。这里的打印是在查询的基础下发生的一个新动作,而查询本身并不会因为不能打印就不能实现。而考生信息就是查询这个基础用例留给打印这个扩展用例的扩展点。
     
    图9(扩展)
  
            图10(扩展关系)

         在讲解了用例图中这四种关系之后,我们可以对比一下这四种关系。
       (1)关联与泛化对比:
               不同:关系存在时间的长短上:  
                         关联是只要两个角色或角色与用例存在关联关系就会一直存在。当两者中的一个消亡时这种关联关系才会消失。
                         泛化即我们学过的继承,当子类调用父类的方法时这种关系才存在,也就是说泛化关系是一种即时性的、短暂性的关系。这种关系比关联要弱,但在使用时,能用泛化就不用关联,毕竟关联是一种不确切的关系。

          (2)泛化、包含与扩展对比:
          
                  1. 共性:
                           都是从现有的用例中抽取出公共的那部分信息,作为一个单独的用例,然后通后过不同的方法来重用这个公共的用例,以减少模型维护的工作量    
                 2.  不同:      
                          泛化:即继承,是父类与子类的关系,子类与父类有公共的功能。父类与子类可以分别独立存在。子类消失对父类无影响,但如果父类消失那么子类就会缺少原先父类中的那部分功能。父类的功能是包含在子类中的。
                         包含:是包含与被包含的关系。包含这一基础用例它要实现这一功能行为它就要做被包含这一包含用例的功能行为。即它要完成一件事就要做另一件事。需要注意的是,基础用例的实现是在包含用例实现的基础上的,但不是说要想实现基础用例就要实现所有的包含用例。包含用例的功能是包含在基础用例中的。
                        扩展:是基础用例与扩展用例之间的关系。扩展用例只是将基础用例中的某部分信息作为了一个扩展点,而两者间并没有公共的功能。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章