首先说明,在这里我把“关联”、“组合”、“聚合”关系都统一当做“组合”关系来说的,但实际上聚合(has-a)是关联的一种,组合(cntains-a)也是关联的一种。如果想要知道三者之间的区别,详见这篇博客:

依赖、关联、聚合和组合之间区别_玛丽莲茼蒿的博客-CSDN博客关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。https://blog.csdn.net/qq_44886213/article/details/127332726?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127332726%22%2C%22source%22%3A%22qq_44886213%22%7D

组合关系直接把类B的实例作为自己的成员变量,意思是我拥有了它,它必须作为我必不可而少的部件。

依赖关系只是在自己的成员方法中用到了类B,意思是我使用了它,但我不一定拥有它。

还是拿【司机】和【车】来举例。

如果采用组合关系,意思是,“我有一辆车,这辆车是我的了,我开我自己的车”

class Car{public void run(){System.out.println("在跑了在跑了");}
}class Driver{Car myCar; //这辆车是我的public void drive(){myCar.run();}
}

如果采用依赖关系,意思是“我开走了一辆车,但这辆车不一定是我的”

class Car{public void run(){System.out.println("在跑了在跑了");}
}class Driver{public void drive(Car car){ //这辆车不一定是我的,反正我开跑了car.run();}
}

在实际开发中如何选择用依赖关系还是组合关系呢?

答案是whatever!

理论分析:根据耦合性有强到弱的关系:继承∣实现→组合→聚合→关联→依赖

因为组合关系比依赖关系的耦合性更强,这也就要求我们能用依赖关系就不要用组合关系,

但有的时候类B必须作为类A的一个部件(类A必须拥有类B),就得用组合关系了(见策略模式中Duck和Character的例子)

举一个更贴切的例子,Person类和Arm类就必须是组合关系,因为一个人必须有自己的胳膊,不能说我用胳膊实现抬手这个动作的时候就通过形参随便拿别人的胳膊用一用。

实际开发:貌似使用组合关系比使用依赖关系带来的耦合性并不大,所以基本上都用组合,比如观察者模式的例子里,明明可以用依赖关系,却选用了组合关系,因为毕竟拥有了这个类(将其作为成员变量)才能方便地在所有成员方法中操作它。

如果不明白该用组合关系还是依赖关系,就来看这一篇!相关推荐

  1. 【面向对象编程】(3) 类之间的交互,依赖关系,关联关系

    各位同学好,今天和大家分享一下面向对象编程中,类之间的交互,类之间的依赖关系和关联关系.有不明白的可见前一章节:https://blog.csdn.net/dgvv4/article/details/ ...

  2. npm package.json文件中的依赖关系,devDependencies和peerDependencies之间有什么区别?

    本文翻译自:What's the difference between dependencies, devDependencies and peerDependencies in npm packag ...

  3. 关联关系和依赖关系的区别

    关联关系:A类实例化的时候需要B类的对象引用或指针作为参数 依赖关系:A类的某个方法使用B类,可能是方法的参数是B类或在方法中获得了一个B类的实例 某个类以成员变量的形式出现在另一个类中,二者是关联关 ...

  4. Makefile 7——自动生成依赖关系 三颗星

    后面会介绍gcc获得源文件依赖的方法,gcc这个功能就是为make而存在的.我们采用gcc的-MM选项结合sed命令.使用sed进行替换的目的是为了在目标名前加上"objs/"前缀 ...

  5. oracle对象依赖关系图,Oracle concepts 学习笔记(4)——Schema对象间的依赖关系

    Schema对象间的依赖关系 一些对象的定义,包括视图和存储过程,需要引用其它的对象,比如表.因此,这些对象的定义将依赖于被引用的对象的定义. 一.简单介绍依赖 一些类型的schema对象可以引用其它 ...

  6. 关联关系和依赖关系的思考

    关联关系和依赖关系的思考 从宏观上看类与类之间的关系有关联,依赖,泛化和实现. 这其中泛化和实现很好理解,关联和依赖之间的关系不好理解. 下面详细说一下这几个的意思: 1.泛化 泛化:表示类与类之间的 ...

  7. JavaSE(this与super关键字;关联、依赖关系)

    this与super 1. this与super访问普通成员 1.1 this和super访问注意事项 调用普通成员: this.成员变量 可以访问本类对象的成员变量 super.成员变量 可以访问父 ...

  8. java uml类图虚线实线_终于明白六大类UML类图关系了

    UML,全称Unified Modeling Language,统一建模语言.而UML图分为用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等9种图. 在面向对象语言中,我们经常看 ...

  9. 依赖:类之间的依赖关系【python】

    类之间的依赖关系:   八股文如下: 依赖关系是最常见的一种关系,是一种使用关系,即一个类的实现(或部分方法的实现)需要另外一个类的协助,所以应尽量避免双向的互相依赖关系: 对象 A 持有对象 B 的 ...

最新文章

  1. 【Java源码分析】Vector源码分析
  2. wincc历史数据库_什么是数据库?如何学习数据库?
  3. 事务(ACID)、并发一致性问题(丢失修改、读脏数据、不可重复读、幻影读)、封锁(封锁粒度、类型、协议、MySQL 隐式与显示锁定)
  4. 主要技术指标简介_期货常用技术指标(五)布林线
  5. Java虚拟机:类加载机制详解
  6. 决定以太坊未来的三个关键扩容项目
  7. scala apply方法 笔记
  8. linux清除硬盘,linux下清除硬盘的几种方法
  9. php sqlite视图,SQLite 视图
  10. [论文阅读] State-Relabeling Adversarial Active Learning
  11. 海康相机SDK+halcon17(64位)+MFC+VS(64位)联合开发遇到的问题(在使用GenImage3Extern将RGB数据转换为halcon图像时出现异常情况处理)
  12. 三十岁还没做到管理层的人,后来都怎么样了?
  13. Wait 线程阻塞 与 Notify、NotifyAll 线程唤醒
  14. git add 所有修改文件_工作中Git的使用实践
  15. 弯管机程序使用三菱FX系列 PLC和昆仑通态触摸屏,也可以用三菱F940系列触摸屏
  16. 华为路由器配置备忘录
  17. 马蜂窝ABTest多层分流系统的设计与实现
  18. 网宿cdn api 刷新缓存函数
  19. 如何成为一个很厉害的人(时间之尺)
  20. 信息系统安全概述(课程笔记)

热门文章

  1. 新Edge浏览器对比评测,微软找回面子全靠它了
  2. 电子计算机设置时间,电脑设置年月日_电脑怎么设置年月日
  3. 利用DirectShow开发C#版的MP3播放器(二)
  4. excel分类_Excel 的10个神奇功能,你会用几个?
  5. 江苏省政府参事徐惠民莅临聚合数据走访指导
  6. LINUX下简单实现ISP图像处理从RAW到RGB,BMP算法、RGB到JPEG库的使用(一)
  7. 简单实现 Android 闹钟
  8. shell可以卖钱_【一点资讯】什么叫Shell Cordovan呢?马臀皮鞋子,牛仔裤和腰带能卖多少钱...
  9. Unity 3D模型展示之拖拽
  10. 10047.GNU Make 使用手册中译版(转)