【设计模式】UML类图关系中的数量表示(详细版)
在UML类图中,数量表示(Multiplicity)用于精确描述类之间的关联关系中对象实例的数量对应关系。它位于关联连线的两端,表示"一个类的实例可以关联到多少个另一个类的实例"。
参考资料:UML基础教程资料!
(关注不迷路哈!!!)
文章目录
前言
常见数量表示符号及含义
标识 | 含义 | 示例场景 |
---|---|---|
0…1 | 0个或1个(最多1个) | 一个人可能有0或1个配偶 |
0…* 或 * | 0个或多个(数量不限) | 一个顾客可以有0或多个订单 |
1…1 或 1 | 只有1个(必须存在) | 一辆汽车必须有且只有1个引擎 |
1…* | 1个或多个(至少1个) | 一个部门必须有1名或多名员工 |
n…m | 特定数量范围 | 一个学期有12…16周课程 |
标准符号体系
一、数量表示的应用规则
- 位置规则:
- 数量标注位于关联关系的两端
- 标注在靠近目标类的一端
- 语法规则:
- 使用两个数字表示范围,中间用"…"连接
- 单个数字表示固定数量
- ""表示无限多(等同于0…)
- 双向关联的数量对应:
- 两端数量可以不同
- 例如:公司(1)—(1…*)员工
二、典型应用场景示例
- 一对一关系(1:1):
[身份证] "1" ———— "1" [人]
特征:
- 双向强制存在
- 代码实现:互相持有对象引用
- 一对多关系(1:N):
[公司] "1" ———— "*" [部门]
业务规则:
- 父项必须存在
- 子项数量可扩展
- 多对多关系(M:N):
[学生] "*" ———— "*" [课程]
实现方式:
- 需要中间关联表
- 双向无限扩展
- 可选关系(0…1):
[用户] "1" ———— "0..1" [会员卡]
三、数量表示的特殊情况
- 复合数量表示:
- 可以组合多个范围,用逗号分隔
- 示例:
1..3, 5..7
表示1-3个或5-7个
精确数量表示:
- 使用具体数字,如
2
、4
等 - 示例:一副扑克有
52
张牌
- 使用具体数字,如
无限多表示:
*
是0..*
的简写- 表示数量没有上限限制
四、数量表示的设计意义
- 业务约束:
- 反映现实世界中的业务规则
- 例如:一个订单必须关联至少1个商品
- 数据库设计指导:
- 直接影响数据库表的外键设计
- 1:N关系通常转换为外键
- M:N关系需要中间关联表
- 代码实现指导:
- 影响类的成员变量设计
1
对应对象实例*
对应集合类型
五、综合场景示例
场景1:汽车驾驶系统
[汽车] "1" ◆——— "4" [轮胎]
[汽车] "1" ◆——— "1" [引擎]
[车主] "1" ———— "0..*" [汽车]
解释:
- 每辆汽车必须且只能有1个引擎
- 每辆汽车必须有4个轮胎
- 每个车主可以拥有0辆或多辆汽车
场景2:商品订单系统
“每个订单(Order)必须包含1-20个商品(Item),每个商品可以属于0-5个促销活动(Promotion)”
场景3:学校管理系统
特征:
- 动态范围约束(4-8门课)
- 资源分配关系(课程与教室)
场景4:医疗系统
特殊约束:
- 医生负载均衡(5-10个患者)
- 患者可能无处方(术后观察期)
六、验证性问题
- 如何表示"每个用户必须绑定1-2个支付方式"?
- 若改为"至少1个,建议不超过3个"应如何调整?
总结
提示:拥抱变化,而不被变化摧毁!🚀
数量表示开发流程
- 通过数量表示捕获业务规则
- 驱动领域模型设计
- 指导集合类型选择
- 生成数据库约束