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.  不同:      
                          泛化:即繼承,是父類與子類的關係,子類與父類有公共的功能。父類與子類可以分別獨立存在。子類消失對父類無影響,但如果父類消失那麼子類就會缺少原先父類中的那部分功能。父類的功能是包含在子類中的。
                         包含:是包含與被包含的關係。包含這一基礎用例它要實現這一功能行爲它就要做被包含這一包含用例的功能行爲。即它要完成一件事就要做另一件事。需要注意的是,基礎用例的實現是在包含用例實現的基礎上的,但不是說要想實現基礎用例就要實現所有的包含用例。包含用例的功能是包含在基礎用例中的。
                        擴展:是基礎用例與擴展用例之間的關係。擴展用例只是將基礎用例中的某部分信息作爲了一個擴展點,而兩者間並沒有公共的功能。


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