在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. day09-类型转换

    类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换 低-----------------------------------------------------高 byte ...

  2. 你真的理解 Kubernetes 中的 requests 和 limits 吗?

    在 Kubernetes 集群中部署资源的时候,你是否经常遇到以下情形: 经常在 Kubernetes 集群种部署负载的时候不设置 CPU requests 或将 CPU requests 设置得过低 ...

  3. PHP将整形数字转为Excel下标

    1.背景 这两天在接到一个需求,需要导出一个班级所有学员的所有成绩,在最后excel表处理的时候发现导出的列超过了26列,后面会出现AA之类的下标,所以写了一个函数把数字整型转为Excel对应的下标. ...

  4. uni-app H5 腾讯地图无法导航

    uni-app 打包H5腾讯地图无法导航 具体使用扫描二维码查看 前言: 最近几天用uni-app开发安卓和iOS应用,打包成APP安装包后,APP内做地图导航没有问题,APP内使用的是高德地图:但是 ...

  5. BeautifulSoup优化测试报告

    一.是什么 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库. 中文官方文档:https://beautifulsoup.readthedocs.io/zh_C ...

  6. 模算术 modular arithmetic

    https://en.wikipedia.org/wiki/Modular_arithmetic#Integers_modulo_n 模算术: 整数达到特定值时会' 折返 ' 回来-- 模数 modu ...

  7. MudBlazor:基于Material Design风格开源且强大的Blazor组件库

    项目介绍 MudBlazor是一个基于Material Design风格开源.免费(MIT License).功能强大的Blazor组件框架,注重易用性和清晰的结构.它非常适合想要快速构建Web应用程 ...

  8. 禁止http请求自动跳转到https--解决网站使用了HSTS的问题

    前言 目前有些网站支持http和https两种协议访问,有些只支持一种协议访问.根据动态域名安全策略(HSTS),只要该域名在浏览器中访问过一次https,那么,谷歌浏览器会自动将http跳转到htt ...

  9. OpenCV开发笔记(八十二):两图拼接使用渐进色蒙版场景过渡缝隙

    前言   对于图像拼接,前面探讨了通过基于Stitcher进行拼接过渡和基于特征点进行拼接过渡,这2个过渡的方式是摄像头拍摄角度和方向不应差距太大.  对于特定的场景,本身摄像头拍摄角度差距较大,拉伸 ...

  10. ARC134C The Majority

    ARC134C The Majority link:[ARC134C] The Majority 小清新数学题.(反正我做不出来) 简要题意 有\(K\)个箱子,编号为\(1\)到\(K\)的箱子.起 ...