在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中前三个参数都有严格限定的值的个数。



多重性还可应用于其他一些行为元素中,其用法大抵一致,使用时可以举一反三,本文不再赘述。

UML之属性与参数的多重性的更多相关文章

  1. VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

    在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10")  VB的语法,使用参数的不一定是方法,也有可能是属性 ...

  2. 参数对象Struts2中Action的属性接收参数

    题记:写这篇博客要主是加深自己对参数对象的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. Action中三种传递并接受参数: 1.  在Action添加成员属性接受参数 例如请求的 ...

  3. struts----用Action的属性接收参数

    本次学习的内容是用Action的属性接收参数 具体内容为: 一.准备工作 1.新建Web工程 2.添加struts:右键点击工程名选择My Eclipse-->点击add struts..--& ...

  4. Action属性接收参数

    一.action的属性(地址栏传参)接收参数:如果使用的JDK属性不一致,则会使得传值无法实现.解决办法:1.系统自身需要用到的JDK(window——>属性——>Java——>In ...

  5. delphi使用SQL的教程4(使用Params属性为参数赋值 )

    17.4.1 使用Params属性为参数赋值   TQuery部件具有一个Params属性,它们在设计时不可用,在程序运行过程中可用,并且是动态建立的,当为TQuery部件编写动态SQL 语句时, D ...

  6. 01_7_Struts_用Action的属性接收参数

    01_7_Struts_用Action的属性接收参数 1. 配置struts.xml文件 <package name="user" namespace="/user ...

  7. uml设计之多重性

    ---------------------------------------------------------------------------------------------------- ...

  8. struts2属性Struts2中属性接收参数中文问题和简单数据验证

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 一:如果表单提交数据中有中文时,尽量应用post方式. 需要在Struts. ...

  9. Struts2_用Action的属性接收参数

    先在 Action 中定义要接收的属性,需要编写属性的getter 和 setter 方法 struts2 会自动帮我们把 String 类型的参数转为 Action 中相对应的数据类型. priva ...

  10. 用List表示多重性

    练习目标-在类中使用List作为模拟集合操作: 在本练习中,将用List实现银行与客户间的多重关系. 任务 对银行来说,可添加Bank类. Bank 对象跟踪自身与其客户间的关系.用Customer对 ...

随机推荐

  1. shiro 框架基本讲解【转载】

    shiro 框架基本讲解[转载] 什么是权限管理: 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而 ...

  2. 24个希腊字母与 Tex 表示

    大写 小写 英文 中文 Α α Alpha 阿尔法 Β β Beta 贝塔 Γ γ Gamma 伽马 Δ δ Delta 德尔塔 Ε ε Epsilon 艾普西隆 Ζ ζ Zeta 泽塔 Η η Et ...

  3. 为Markdown/HTML文档生成一个简易目录

    现在阅览文章的网页往往都带有一个目录,方便点击跳转.目录一般都是根据文档中的标题级别直接生成的. 现在我们也来模仿一个简单的,无非就是把<h1><h2>...的序列转化成树嘛 ...

  4. C语言常见概念

    目录 1.C语言是什么? 2.编译器的选择Clion 3.第一个C语言程序 4.main函数 5.printf和库函数 6.关键字介绍 7.字符和ASCII编码 8.转义字符 9.语句和语句分类 9. ...

  5. 字符串、列表、元组、字典(python)

    文章目录 1.python字符串 1.1 python访问字符串中的值 1.2Python 字符串连接 1.3Python字符串运算符 2.python列表 2.1访问列表中的值 2.2更新列表 2. ...

  6. jsp页面访问数据库根据数据情况,定时弹出提醒

    需求:根据数据库情况,在页面定时弹出相应的消息 实现: 1. 展示DIV设置 <script language="javascript" type="text/ja ...

  7. 『玩转Streamlit』--页面布局

    一个优秀的数据应用不仅仅是功能的强大,更在于其用户体验的打造. 而良好的页面布局,作为用户体验的重要组成部分,不仅能够提升信息的可读性,还能引导用户高效地完成操作. 反之,混乱的布局会让人感到困惑和挫 ...

  8. react hooks + ts 封装组件

    react hooks+ts组件封装 简介 在react使用ts封装组件,需要注意类型, 使用 forwardRef 方法包起来 子组件 import * as React from "re ...

  9. C240817D. 模拟赛:树上dp(以i为起点)+set操作

    C240817D. 模拟赛 比较显然的树上dp, 但是维护set比较烦 考场上其实自己是定义 \(f[i]\) 是以 \(i\) 结尾, 然后这样的话单次更新根本做不到 \(O(logN)\). 反应 ...

  10. Windows系统密钥(实测可用)

    Windows Server 2003 R2 sp2 standard edition 文件名:cn_win_srv_2003_r2_standard_with_sp2_cd1_X13-13927.i ...