zoukankan      html  css  js  c++  java
  • 【UML】关联、依赖、泛化、实现等关系说明

    导读:再上一篇博客中,介绍了UML的9种图,现在,将对UML中的关系进行总结。图很重要,但图形中的各种关系也很重要,这扯关系的事儿,从来都是大事儿。


    一、基本定义

    1.1 总体说明


    1.2 具体定义

    1,关联

    定义:体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的。也有自身关联。

    单向关联


    教师和课程是单向关联,一名老师可以教授多门课程,但课程是抽象类,它不能拥有老师。

    双向关联


    老师和学生属于双向关联,老师可以有多名学生,学生也可以有多名老师。

    自身关联


    一个雇员可以是一个工作者,还可以是一个厨师,它们之间是一个责任关系。(PS:这一个关系不是很清楚)

    聚合

    定义:聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。


    雁群,由很多只雁聚集而成,这时候,雁群和单个的雁之间的关系,就是聚合关系。也就是Has——a关系。

    组合

    定义:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。


    一指雁,有两只翅膀。这时候翅膀和雁就是组合关系。翅膀不能脱离雁而存在,就像是手脱离了身体就不是手了一样。没有雁这个主体存在,就没有翅膀。

    2,依赖

    定义:是一种使用关系,可以是类、包、构件之间的关系。


    依赖关系,是普遍存在的一种关系。动物的生成需要依赖水。一个人可以使用0个或多个杯子。

    3,泛化

    定义:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。


    泛化关系,可以等同于继承关系。如人是抽象出来的一个类,老师和学生是另外的两个类,但老师和学生又属于人这个大类,同时又有自己的一些特性。

    4,实现

    定义:是一种类与接口的关系,表示类是接口所有特征和行为的实现.。


    实现,体现了接口的重用,我觉得是体现了面向对象中的多态。像发声这个动作,就有狗、猫、羊不同的接口去实现,虽然都是发声,但实现的过程不同。


    二、相互关系

    2.1关联和聚合

    联系: 关联和聚合为通信提供了一条途径;关联是两个类间的非直接连接,聚合是关联的一种强制模式。

    区别:如果两个对象通过整体和部分的关系具有紧密的边界,这种关系成为聚合;如果两个对象通常被认为是独立的,这种关系称为关联。

    2.2 聚合和组合

    联系:都是一种关联联系,表达了整体/部分的关系。

    区别:聚合关系的部分和整体都有各自的生命周期,也就是说聚合关系中的部分可以脱离整体存在;组合关系中的部分不能脱离整体存在。

    2.3 泛化和继承

    联系:都表示一个子类继承父类的基本功能,同时增添自己的新功能。(在语义上可以等同)

    区别:是自上而下和自下而上的区别。如:水果泛化苹果;苹果继承水果。

    2.4 泛化和实现(纯属个人理解)

    联系:都实现了重用,节约了开发时间。

    个人理解:从面向对象的开发技术来看,泛化=继承,实现=多态。

    区别:泛化,实现了代码的重用,就是好一些属性什么的。实现,实现了接口的重用。感觉上,这个实现比泛化更抽象。


    三、总结

    把关系的各个定义、联系和区别分清了,我们很容易的就发现关系之间的强弱对比。

    实现=泛化>关联>依赖

    呵呵,突然就想到我当时看UML视频关于关系这一块讲解的时候,脑袋里蹦出的笑话。其实吧,这个关系的强弱很容易理解。小女孩依赖一个女人,不能说明她们之间有什么关系,但如果这个小女孩是女人姐姐的孩子,这时候她们之间的关联就变成亲戚的关系。然后,如果这个女孩就是这个女人自己的孩子,就会发现这个小女孩和女人至少有一处共同点,这时候就是泛化了。其实这个故事呢是有后篇的,也就是关于“实现”,虽然生活中也有,但是好像有点离谱,我就不说了。


    四、个人感受

    其实刚开始一听到泛化等于继承的时候,就觉得这里肯定有问题。我就突然想到了黑格尔的唯心论:存在即合理,合理就是现实的。我就觉得,既然都等同了,为什么不直接用继承,还非要用泛化呢。还有就是,说泛化=实现,既然都等于了,那取一个就行了,为什么还要有两个。然后,就是这种想法,一直让我去不断的找联系,找区别。事实证明:果真还是不同的。不得不说吧,有时候唯心主义能解决的问题,唯物主义还不一定行。嘿嘿。

    好好学习,天天向上。紧接着就要开始实践了,加油!一条散发着神秘与危险信号的路途,马上就要开始了。


    请大家多多指教,谢谢!

  • 相关阅读:
    树的最小支配集 最小点覆盖 与 最大独立集 (图论)
    P1993 小K的农场 (差分约束)
    P1168 中位数 (优先队列,巧解)
    STL 优先队列
    P3799 妖梦拼木棒 (组合数学)
    P2389 电脑班的裁员 (动态规划)
    3-Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
    1-匿名对象
    2-封装性
    2-递归调用
  • 原文地址:https://www.cnblogs.com/hhx626/p/6010468.html
Copyright © 2011-2022 走看看