2019独角兽企业重金招聘Python工程师标准>>>

如果你确定两件对象之间是is-a的关系,那么此时你应该使用继承;比如菱形、圆形和方形都是形状的一种,那么他们都应该从形状类继承而不是聚合。
                         如果你确定两件对象之间是has-a的关系,那么此时你应该使用聚合;比如电脑是由显示器、CPU、硬盘等组成的,那么你应该把显示器、CPU、硬盘这些类聚合成电脑类,而不是从电脑类继承。

类间的关系

网上关于此类的讨论非常多,发现对于该问题的理解各有各的说法,而各个说法中又相去甚远。通过浏览这些讨论以及对《O'Reilly                          - UML 2.0 In A Nutshell (2007)》的参考,发表一下自己的看法

类间关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。

纵向关系就是继承关系,它的概念非常明确,也成为OO的三个重要特征之一,这里不过多的讨论。

横向关系较为微妙,按照UML的建议大体上可以分为四种:

  1. 依赖    (Dependency)

  2. 关联    (Association)

  3. 聚合    (Aggregation)

  4. 组合    (Composition)

它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合

然而它们四个之间的差别却又不那么好拿捏,需要好好体会。

  1. 依赖

  • UML表示法:虚线 + 箭头
                                   

  • 关系:" ... uses a ..."

  • 此关系最为简单,也最好理解,所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。

  • 典型的例子很多,比如:
                                   class Human
                                   {
                                       public void breath()
                                       {
                                           Air                                freshAir = new Air();
                                           freshAir.releasePower();
                                       }
                                       public static void main()
                                       {
                                           Human                                me = new Human();
                                           while(true)
                                           {
                                               me.breath();
                                           }
                                       }
                                   }
                                   
                                   class Air
                                   {
                                       public void releasePower()
                                       {
                                           //do                                sth.
                                       }
                                   }
                                    

  • 释义:一个人自创生就需要不停的呼吸,而人的呼吸功能之所以能维持生命就在于吸进来的气体发挥了作用,所以说空气只不过是人类的一个工具,而人并不持有对它的引用。

关联

  • UML表示法:实线 + 箭头
                                   

  • 关系:" ... has a ..."

  • 所谓关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解 除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。

  • 典型的例子很多,比如:
                                   class Human
                                   {
                                       ArrayList friends = new                                ArrayList();
                                       public void makeFriend(Human                                human)
                                       {
                                           friends.add(human);
                                       }
                                       public static void main()
                                       {
                                           Human                                me = new Human();
                                           while(true)
                                           {
                                               me.makeFriend(mySchool.getStudent());
                                           }
                                       }
                                   }
                                   

  • 释义:人从生至死都在不断的交朋友,然而没有理由认为朋友的生死与我的生死有必然的联系,故他们的生命期没有关联,我的朋友又可以是别人的朋友,所以朋友可以共享。

聚合

  • UML表示法:空心菱形 + 实线 + 箭头
                                   

  • 关系:" ... owns a ..."

  • 聚合是强版本的关联。它暗含着一种所属关系以及生命期关系。被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系。

  • 典型的例子很多,比如:
                                   class Human
                                   {
                                       Home myHome;
                                       public void goHome()
                                       {
                                           //在回家的路上
                                           myHome.openDoor();
                                           //看电视
                                       }
                                       public static void main()
                                       {
                                           Human                                me = new Human();
                                           while(true)
                                           {
                                                                              //上学
                                                                              //吃饭
                                               me.goHome();
                                           }
                                       }
                                   }
                                    

  • 释义:我的家和我之间具有着一种强烈的所属关系,我的家是可以分享的,而这里的分享又可以有两种。其一是聚合间的分享,这正如你和你媳妇儿都对这个家有着同样的强烈关联;其二是聚合与关联的分享,如果你的朋友来家里吃个便饭,估计你不会给他配一把钥匙。

组合

  • UML表示法:实心菱形 + 实线 + 箭头
                                   

  • 关系:" ... is a part of  ..."

  • 组合是关系当中的最强版本,它直接要求包含对象对被包含对象的拥有以及包含对象与被包含对象生命期的关系。被包含的对象还可以再被别的对象关联,所以被包含对象是可以共享的,然而绝不存在两个包含对象对同一个被包含对象的共享。

  • 典型的例子很多,比如:
                                   class Human
                                   {
                                       Heart myHeart = new Heart();
                                       public static void main()
                                       {
                                           Human                                me = new Human();
                                           while(true)
                                           {
                                               myHeart.beat();
                                           }
                                       }
                                   }
                                   

  • 释义:组合关系就是整体与部分的关系,部分属于整体,整体不存在,部分一定不存在,然而部分不存在整体是可以存在的,说的更明确一些就是部分必须创生于整 体创生之后,而销毁于整体销毁之前。部分在这个生命期内可以被其它对象关联甚至聚合,但有一点必须注意,一旦部分所属于的整体销毁了,那么与之关联的对象 中的引用就会成为空引用,这一点可以利用程序来保障。心脏的生命期与人的生命期是一致的,如果换个部分就不那么一定,比如阑尾,很多人在创生后的某个时间 对其厌倦便提前销毁了它,可它和人类的关系不可辩驳的属于组合。
                                   在UML中存在一种特例,就是允许被包含对象在包含对象销毁前转移给新的对象,这虽然不自然,但它给需要心脏移植的患者带来了福音。

转载于:https://my.oschina.net/Sheamus/blog/466947

面向对象UML中类关系相关推荐

  1. 认识 UML 类关系——依赖、关联、聚合、组合、泛化

    文章目录 1.依赖(Dependency) 2.关联(Association) 3.聚合(Aggregation) 4.组合(复合,Composition) 5.泛化(Generalization) ...

  2. 8. UML中类的有三种,下面哪个不是其中之一()

    标签: 软考初级程序员易错题,计算机基础, 面向对象基础,统一建模语言 (UML) 8. UML中类的有三种,下面哪个不是其中之一() 问题1 A实体类 B抽象类 C控制类 D边界类 正确答案B 我的 ...

  3. 转载:认识UML类关系——依赖、关联、聚合、组合、泛化

    文章目录 1.依赖(Dependency) 2.关联(Association) 3.聚合(Aggregation) 4.组合(复合,Composition) 5.泛化(Generalization) ...

  4. UML中类图与对象图的区别

    UML中类图与对象图的区别 类图 对象图 类具有3个分栏:名称.属性和操作 对象只有两个分栏:名称和属性 在类的名称分栏中只有类名 对象的名称形式为"对象名:类名",匿名对象的名称 ...

  5. UML对象关系与箭头对应表

    对象和类 类是构造对象的模板 封装是与对象有关的一个重要的概念,从形式上来看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式.对象中的数据称为实例域,操作数据的过程称为方法 ...

  6. python核心编程:Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解

    这篇文章主要介绍了Python面向对象程序设计中类的定义.实例化.封装及私有变量/方法,结合具体实例形式较为详细的分析了Python面向对象程序设计中类的定义.实例化.封装.私有变量.私有方法等相关使 ...

  7. UML中类之间的几种关系

    类之间可能存在以下几种关系:关联(association).依赖(dependency).聚合(Aggregation,也有的称聚集).组合(Composition).泛化(generalizatio ...

  8. UML各种关系,图的介绍(附加案例)

    本篇文章系我总结了网上好多片文章外加自己做图编辑而成,留作自用.主要参考如下博客: UML的九种图例详解 UML各种图总结-精华 UML视图(四)状态图 另附UML教学课件,学校上课用的,挺不错的.点 ...

  9. 我所理解的OOP——UML六种关系

    最近由于经常给公司的小伙伴儿们讲一些OOP的基本东西,每次草纸都被我弄的很尴尬,画来画去自己都乱了,有时候也会尝试使用UML表示类之间的关系,但UML从毕业后就再也没接触过了,经常会被小伙伴儿们指出继 ...

最新文章

  1. 嵌入式驱动程序之信号量
  2. flowable对比
  3. Shiro的鉴权方式
  4. DTLS协议中的509证书和密钥如何传输
  5. matlab 曲线拟合--视频编码中PSNR计算及码率计算
  6. python装饰器详解-python装饰器使用实例详解
  7. winform DataGridView.Refresh()不及时更新,设计线程
  8. 并发编程之美-终章chat
  9. 信息系统项目管理师---第八章 项目质量管理
  10. candence的图纸大小设置_标准制图图纸尺寸大小
  11. 渗透测试教程(基础篇)-2
  12. 黑色商务中国风禅茶一味产品宣传介绍PPT模板
  13. 青果教务php,拟物校园 | 拟物校园,一个高校教务系统爬虫,现支持正方教务、青果教务。...
  14. python输出九九乘法表
  15. 成功真正需要什么:情商德商及体商 别高估智商
  16. 现代软件工程讲义 5.1 软件的质量保证 (QA) 和测试 (Test)
  17. 【Audio】声临其境——杜比音效介绍
  18. 查看字符的所占字节数
  19. githubDesktop的使用说明(附下载链接)
  20. 有限差分法在最优化问题中的应用

热门文章

  1. 致远互联“平台+生态”抢占数字化升级新赛
  2. 18不使用委托实现能自动侦测车距的智能汽车
  3. 如何用Chrome自带的截屏功能截取超过一个屏幕的网页
  4. 小知识一、让Swift继续用OC#warning效果
  5. BitmapFactory.Options.inSampleSize 的使用方法
  6. Mongodb集群 - 副本集内部选举机制
  7. 刘宇凡:数字让切糕与电商溅起涟漪
  8. SqlServer2005复制分类
  9. 关于java中Math的一些用法
  10. 吃了这些数据集和模型,跟 AI 学跳舞,做 TensorFlowBoys