在UML中,多重性是指一個條目潛在的數量範圍。多重性可被用於屬性、操作參數、關聯關係。UML元模型也使用多重性對元模型元素之間的關係進行約束。多重性總是包含基數值,它是相關條目在現實世界中的確切數量。本文將説明類屬性和類操作參數的多重性。
一、屬性的多重性
假設我們需要定義一個表示書的Book類,它包含有一系列的屬性。我們只選取其中的書名(title)、作者(author)、頁數(pages)少數幾個屬性進行多重性研究説明。在此前提下,Book的相關屬性用類圖表示如下:
在上圖中,書的作者(author)是一個人,但在現實世界中,一本書的作者可能不止一人。為了能讓Book類的定義適應大多數情況,我們可以考慮將作者增加到三人,這三名作者分別用屬性author1、author2、author3表示,修改後的類圖如下:
不過,上述設計還是存在一些潛在的問題,下面分別討論。
首先,一本書的作者數量的限制(上述設計中的3個)是否合理?一些論文期刊允許最多3~5名作者,而許多書的作者則比3個更多,在科學研究領域,一些論文(有些論文本足以作為一本書)的作者超過了3500人。顯然3500個作者的情況並不多見,但為了能夠實例化作者眾多的書籍,必須增加更多的作者屬性。但多少個作者是合適的,這是一個難以確定的問題。
其次,定義數量龐大的作者屬性而被實例化的書的作者又很少時,由於無法約束必須將作者挨個存儲在排在前面的屬性中,我們將不得不檢查所有的作者屬性,顯然它的代碼實現將是笨重低效的。
最後,可以使用循環簡化處理眾多的作者屬性嗎?由於這些屬性的名稱不同(雖然只是後綴不同,但它們是不同的屬性名),對這種名稱的循環在大多數編程語言中實現是困難的。
UML為上述問題提供的解決方案是指定屬性的多重性,即可通過標記説明作者(author屬性)的多重性表達這個屬性可以存儲多個值。採用多重性的Book類圖如下:
在上圖中可以看到,屬性author在其類型Person後增加“[1..*]”説明,“[1..*]”定義了屬性author的多重性,它表明屬性author的值可以從1個到無限多個,或者説屬性author至少有一個值。多重性使用中括號“[]”説明其允許的數量,在“[1..*]”中,1是下限,*是上限,中間的兩個點表示省略的中間值,而*代表無限大,因此在這個類圖中,屬性author中可存儲作者的數量是從1個到無限個,即屬性author存儲作者的數量沒有限制。使用中括號“[]”説明多重性時,上限必須大於等於下限。
通常一本書至少有一名作者,而在某些特殊情況下,書的作者信息可能丟失了(佚名),或者某些電子書的作者故意不留下自己姓名,此時author這個屬性的多重性就應當設定為“[0..*]”,表示有零個或者多個作者,修改後的類圖如下:
在多重性為“[0..*]”時,因為其值最少可以為零,最多沒有限制,表明該屬性是一個可選的屬性,又是一個可以有多重值的屬性。在這種情況下,可以僅使用“*”更簡單地表示,即“[*]”。按這種方式表達的類圖如下:
瞭解了屬性author的多重性以後,或許有人認為屬性pages也應當被指定多重性。pages表示一本書的頁數,書的頁數確實也是一個範圍內的數值,但是對於確定的一本書而言,作者可能有多個,而它的頁數卻是確定的一個數值。因此屬性pages不具備多重值。如果您的意圖是限制一本書頁數所允許的範圍,可以使用約束(constraint)進行指定。
同理,表示書名的屬性title也不具備多重性。不過,在UML中,也允許我們使用多重性的表示方法明確指明一個屬性僅有一個值。其表示方法是將多重性的上下限均指定為1,即“[1..1]”或“[1]”,故類Book的類圖可修改如下,屬性title和pages分別使用了上述兩種形式限定其值僅有一個。
在UML中,多重性的默認值是“[1]”,即如果一個屬性不指定多重性則表明該屬性應當有且僅有一個值。因此,上面的兩個圖是等價的。所以,如果一個屬性的值是可選的,即它的值可為0個或1個,此時需要明確標明其多重性,即“[0..1]”。例如一本書交由出版社正式出版時,會有一名編輯負責該書的編輯與審校,而一本書如果是電子書,則可能由作者直接發佈而沒有編輯。我們為Book類增加屬性編輯(editor)時,同時使用多重性“[0..1]”表明其是可選的。修改後的類圖如下:
在上圖中,我們同時表明了屬性pages的約束,約束使用大括號“{}”進行説明,它可以在屬性中內嵌説明,也可以在類圖中使用一個單獨的區塊説明,或者也可以在類圖的註釋中説明。上圖採用內嵌説明的方式指定了屬性pages的約束。
多重性與約束可同時指定,不過一些UML工具對使用內嵌方式指定這兩者支持不足(主要是不支持內嵌方式的約束),此時可將約束放在類圖的註釋中進行説明。例如同時標明屬性pages的多重性及約束時,可使用下圖表示:

二、操作參數的多重性
我們也可將多重性應用於操作參數,其用法與在屬性上應用相同。當然,如果一個參數的多重性為“[1]”時,我們通常省略不標記。
例如在下圖中,類Ride中有一個設定騎行日程的schedule操作,它包含標明多重性的三個參數:參數for的多重性為“[1..*]”,表示參與騎行的騎手至少有一個;參數itinerary的多重性為“[2..*]”,表示路線至少有兩個點(起點與終點,還可包含若干途經點);參數isSharedRide的多重性為“[0..1]”,表示它是一個可選參數,即該騎行日程是否可分享,通常一個參數如果是可選參數,應為其指定缺省值。
類圖Marriage是另外一個例子,不同於上述示例中各參數多重值個數不定,其操作wed中前三個參數都有嚴格限定的值的個數。
多重性還可應用於其他一些行為元素中,其用法大抵一致,使用時可以舉一反三,本文不再贅述。