您现在的位置是:首页 > 正文

聚合关系和组成关系

2024-01-30 21:13:44阅读 0

一 聚合关系

聚合关系描述了一个较大的事务(整体),是由较小事务(部分)组成的。

公司和部门、部门和员工之间是聚合关系。聚合关系用一个空心菱形表示,菱形要画在“较大的事务”一侧。

1 常见存在聚合关系的类

聚合关系表达的是大事务和小事务、整体和部分之间的关系,常见的就是组织和订单。

比如,企业是一个组织,从总公司到分公司再到营业点是一层层的聚合关系,都表达了大事务和小事务、整体和部分之间的关系。再如,订单和订单项之间是聚合关系,订单是较大事务,订单项是较小事务。

2 聚合的判定案例

很多类间都没有“聚合关系”。比如,订单类图中的订单和支付信息、订单和发票项之间,都不是聚合关系。因为 UML 中的聚合关系表明的是大事务和小事务,整体和部分之间的关系。而订单和支付信息、订单和发票项之间,不存在大事务和小事务之间的关系。

二 组成形式的聚合

组成关系是聚合关系的一种形式,表达了整体对部分有很强的所有权和生存控制,组成一旦创建,部分就和整体共存亡。

下图是部门和员工之间的组成关系,强调的是一个员工只属于一个部门。

下图是班级和老师之间的聚合关系,一个老师可以属于多个班级

1 组成关系的判定标准

组成关系是一种聚合关系,是一种特殊形式的聚合关系。和聚合关系不同的是,组成关系强调了“一心一意”,“同生共死”。

a 一心一意

在一个大型公司里,一个员工必须从属于一个部门,即使是 CEO,也要从属于总裁办,并且不能在其他部门兼职。这个时候员工对部门就是一心一意的。

b 同生共死

部门会被裁掉,当部门被裁掉时,员工要么辞职,要么转岗,部门和员工是同生共死的关系。

一个部门只属于一个公司,如果所有部门都不存在了,公司也就不存在了,同样的,如果公司不存在了,部门也就不存在了,两者之间也是同生共死的关系。

一个学生总是要毕业的,毕业后班级就不存在了,班级和学生之间就是组成关系。

订单和订单项之间也是组成关系,两者也体现了“一心一意”和“同生共死”的关系。

2 聚合关系和组成关系的记忆

可以这样理解,如果员工不是铁了心要和一个部门在一起,他还要兼职,那么两者之间就是聚合关系。没有铁了心,就不是一心一意,就用空心的菱形表示。聚合的意思是,聚则合不聚则散。如果员工铁了心要和一个部门在一起,则两者之间就是组成关系。铁了心就是一心一意,就用实心的菱形表示。

三 聚合关系和组成关系的区别

1 聚合关系包含组成关系

在本质上,组成关系仍然是聚合关系,只是强调了“一心一意”和“同生共死”。

因此在实战中,我们都用聚合关系也可以。比如,在公司,部门和员工的案例中,无论员工是否会“从一而终”,都可以用聚合关系表达。

2 两者的区别和应用

  • 组成关系:强调的是“一心一意”和“同生共死”。
  • 聚合关系:强调的是“临时伙伴”和“各营生死”。

这个区别对产品交互的影响如下。

组成关系:有的公司希望员工只属于一个部门,那么员工和部门之间的关系可以用组成关系表达。如果部门撤销,该员工的工作也就没了。在原型设计中,产品经理就要在撤销部门时,提示要转移所有员工。在转移完毕后员工的访问权限也要变化。

聚合关系:有的公司的员工内部可以兼职,那么员工和其兼职部门之间可以用聚合关系表达。兼职的部门撤销,员工的本来工作还在。

四 对聚合关系和组成关系的第二种解释

认为聚合关系强调了一个事务将另一个事务聚到了一起。此时,前一个事务更像是牵头方、发起方。

比如,用户创建了订单,则用户就是牵头方,其牵头创建了订单,用户和订单之间的聚合关系如下图。

五 小结

聚合关系描述了一个较大的事务(整体)是由较小的事务(部分)组成的。同样是聚合关系,还是有所不同,组成关系强调了“同生共死”和“一心一意”,而普通的聚合关系是“临时伙伴”和“各管生死”。常见的是,一个组织的部门和员工之间是组成关系,一个学校的班级和老师之间是聚合关系。

我们抽象出聚合关系和组成关系,有利于理清部门和员工的关系、老师和班级的关系等,从而有利于指导原型图设计和数据库的搭建。

网站文章

  • TypeScript---Babel的配置

    经过一系列的配置,使得TS和webpack已经结合到了一起,除了webpack,开发中还经常需要结合babel来对代码进行转换以使其可以兼容到更多的浏览器,在上述步骤的基础上,通过以下步骤再将babe...

    2024-01-30 21:13:37
  • 关于Camera.PreviewCallback的调用的三个方式

    ● Camera.PreviewCallback:定义了onPreviewFrame(byte[] data, Camera camera) 方法,当存在预览帧(preview frame)时调用该方法。可以传入保存当前图像像素的字节数组。在Camera对象上,有3种不同的方式使用这个回调: · setPreviewCallback(Camera.PreviewCallback):使用此

    2024-01-30 21:13:29
  • 备份gitlab代码仓库脚本

    备份gitlab代码仓库脚本

    我的gitlab在docker容器里面,而映射的数据路径是/home/gitlab/data下,如果你的gitlab是原生方式安装,请以实际路径为准,一般在/var/opt/gitlab/backup...

    2024-01-30 21:13:01
  • Qt 多线程开启定时任务

    Qt 多线程开启定时任务

    多线程执行一些耗时操作,并且需要固定时间去轮询。

    2024-01-30 21:12:54
  • https://blog.csdn.net/qq_38410730/article/details/90116695

    摘自:https://blog.csdn.net/qq_38410730/article/details/90116695 https://blog.csdn.net/weixin_33700350/...

    2024-01-30 21:12:47
  • Vue中用计算属性来实现过滤(比watch来实现好一点)

    Vue中用计算属性来实现过滤(比watch来实现好一点)

    Vue中用计算属性来实现过滤(比watch来实现好一点

    2024-01-30 21:12:18
  • [大、小根堆应用总结一]堆排序的应用场景

    前言 在整理算法题的时候发现,大根堆(小根堆)这种数据结构在各类算法中应用比较广泛,典型的堆排序,以及利用大小根堆这种数据结构来找出一个解决问题的算法最优解。因此,我打算单独将关于堆的应用独立总结出来,后面每遇到一种跟堆结构相关的应用都放到这个目录下。堆的定义 n个关键字序列L[1…n]称为堆,当且仅当该序列满足: 1. L(i)<=L(2i)且L(i)<=L(2i+1)或

    2024-01-30 21:12:10
  • Luogu-P1941 飞扬的小鸟

    Luogu-P1941 飞扬的小鸟

    题目题目链接测试得分:  100主要算法:  DP(零一背包,完全背包)题干:   背包组合问题应试策略:每一个点都是由前面的状态转移的,并且对后面的状态没有影响,满足最优化原理与无后效性原则,选择算法DP对于图上的每一个点都是由前一列降下来或者是前面升上来的,对于降下来的情况是...

    2024-01-30 21:12:02
  • Windows内核和Linux内核比较

    Windows内核和Linux内核比较

    Windows内核和Linux内核比较

    2024-01-30 21:11:25
  • 关于C语言自定义函数浅谈

    关于C语言自定义函数浅谈

    如果函数不接收用户传递的数据,那么定义时可以不带参数。如下所示:123//bodydataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。functio...

    2024-01-30 21:11:18