前言

上一篇文章UML类图(上):类、继承、实现,讲了UML类图中类、继承、实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联、聚合、组合、依赖,下面开始文章的内容。

注意1:子类中覆盖了父类的abstract方法,方法名再次出现。

注意2:无论哪种关系,箭头指向被依赖方。

关联关系

关联(Assocition)关系是类与类之间最常见的一种关系,它是一种结构化的关系,表示一类对象与另一类对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学生等。在UML类图中,用实线连接有关联关系的对象所对应的类,在Java中通常将一个类的对象作为另一个类的成员变量。关联关系分单向关联、双向关联、自关联,逐一看一下。

1、单向关联关系

单向关联指的是关联只有一个方向,比如顾客(Customer)拥有地址(Address),其Java实现为:

public classAddress

{

}

public classCustomer

{privateAddress address;

}

UML的画法为:

2、双向关联关系

默认情况下的关联都是双向的,比如顾客(Customer)购买商品(Product),反之,卖出去的商品总是与某个顾客与之相关联,这就是双向关联。Java类的写法为:

public classProduct

{privateCustomer customer;

}

public classCustomer

{privateProduct[] product;

}

对应的UML类图应当是:

3、自关联关系

自关联,指的就是对象中的属性为对象本身,这在链表中非常常见,单向链表Node中会维护一个它的前驱Node,双向链表Node中会维护一个它的前驱Node和一个它的后继Node。就以单向链表为例,它的Java写法为:

public classNode

{privateNode nextNode;

}

对应的UML类图应当是:

聚合关系

聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中,成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示,如汽车(Car)与引擎(Engine)、轮胎(Wheel)、车灯(Light),Java表示为:

public classEngine

{

}

public classWheel

{

}

public classLight

{

}

public classCar

{privateEngine engine;privateLight light;privateWheel wheel;publicCar(Engine engine, Light light, Wheel wheel)

{super();this.engine =engine;this.light =light;this.wheel =wheel;

}public voiddrive()

{

}

}

对应的UML类图为:

代码实现聚合关系,成员对象通常以构造方法、Setter方法的方式注入到整体对象之中。

组合关系

组合(Composition)关系也表示的是一种整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系。在UML中组合关系用带实心菱形的直线表示。

比如人的头(Head)和嘴巴(Mouth)、鼻子(Nose),嘴巴和鼻子是头的组成部分之一,一旦头没了,嘴巴也没了,因此头和嘴巴、鼻子是组合关系,Java表示为:

public classMouth

{

}

public classNose

{

}

public classHead

{privateMouth mouth;privateNose nose;publicHead()

{

mouth= newMouth();

nose= newNose();

}public voidshake()

{

}

}

其UML的表示方法为:

代码实现组合关系,通常在整体类的构造方法中直接实例化成员类,这是因为组合关系的整体和部分是共生关系,如果通过外部注入,那么即使整体不存在,那么部分还是存在的,这就相当于变成了一种聚合关系了。

依赖关系

依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

比如,驾驶员(Driver)开车,Driver类的drive()方法将车(Car)的对象作为一个参数传递,以便在drive()方法中能够调用car的move()方法,且驾驶员的drive()方法依赖车的move()方法,因此也可以说Driver依赖Car,Java代码为:

public interfaceCar

{public voidmove();

}

public classDriver

{public voiddrive(Car car)

{

car.move();

}

}

其UML的画法为:

依赖关系通常通过三种方式来实现:将一个类的对象作为另一个类中方法的参数

在一个类的方法中将另一个类的对象作为其对象的局部变量

在一个类的方法中调用另一个类的静态方法

关联关系、聚合关系、组合关系之间的区别

从上文可以看出,关联关系、聚合关系和组合关系三者之间比较相似,本文的最后就来总结一下这三者之间的区别。

关联和聚合的区别主要在于语义上:关联的两个对象之间一般是平等的,聚合则一般是不平等的。

聚合和组合的区别则在语义和实现上都有差别:组合的两个对象之间生命周期有很大的关联,被组合的对象在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁,一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象;聚合则不一样,被聚合的对象可以属于多个聚合对象。

再举例子来说:你和你的朋友属于关联关系,因为你和你的朋友之间的关系是平等的,关联关系只是表示一下两个对象之间的一种简单的联系而已,就像我有一个朋友

你和你借的书属于聚合关系,第一是因为书可以独立存在,第二是因为书不仅仅属于你,也可以属于别人,只是暂时你拥有

你和你的心脏属于组合关系,因为你的心脏只是属于你的,不能脱离与你而存在

不过,实际应用中,我个人感觉三种关系其实没有区分得这么清楚,有些架构师甚至会说"组合和聚合没什么区别",所以,有时候不需要把细节扣得这么细,合理利用对象之间的关系给出设计方案即可。

java uml聚合代码_UML类图(下):关联、聚合、组合、依赖相关推荐

  1. Uml 与 Rational Rose( 类图 )

    Uml 与 Rational Rose( 类图 ) 分类: UML  2005-12-04 16:09 类之间的关系可以分为四种: 关联关系( Association ) 依赖关系( Dependan ...

  2. 常见设计模式代码加类图

    设计模式 本文没有关于设计模式的讲解,主要以示例代码和类图为主,适合有一定基础想要复习设计模式的小伙伴,想看详解请点击这里设计模式详解,类图均为亲手绘制,建议一定理解类图. 工厂模式 // 顶层人类接 ...

  3. java uml类图举例_UML类图介绍

    UML类图非常简单,可以用下面的图表示一个类: 该图表示一个叫做Person的类,该类有name.age.sex三个private属性,每个属性的类型紧跟在冒号的后面.该类有walk和speak两个方 ...

  4. java uml图中的关系_UML类图中的关系

    UML类图中的关系分为四种:泛化.依赖.关联.实现:关联关系又可以细化为聚合和组合. 1. 泛化(Generalization) 泛化是父类和子类之间的关系,子类继承父类的所有结构和行为.在子类中可以 ...

  5. mysql反向生成uml类图_UML类图自动生成,太爽了

    最近在开发的过程当中,对于已有的代码,想将相关类绘制成UML类图,虽然现在有很多UML类图的优秀软件,比如ProcessOn(可视化编辑).draw.io(可视化编辑).PlantUML(代码生成), ...

  6. uml 类图_UML 类图

    UML 类图基本符号 UML 类图基本符号含义 1.类(Class):一般是用三层矩形框表示,第一层表示类的名称,第二层表示的是字段和属性,第三层则是类的方法.第一层中,如果是抽象类,需用斜体显示. ...

  7. uml 菱形_uml类图符号介绍 | 学步园

    UML中的6大关系相关英文: 依赖关系 dependency 关联关系 association 聚合关系 aggregation 组合关系 composition 实现 realization 泛化 ...

  8. Rational Rose正逆向工程(类图转Java代码,Java代码转类图)

     一,正向工程     1.设置默认语言为Java,Tools->Options->Notation->default:选择Java.         2.设置环境变量Class ...

  9. uml 菱形_UML类图的各符号含义

    UML 类图的各符号含义 类图基本符号可拆分为虚线,箭头,实线,空心右三角,实心右三角,空心菱形和实心菱形.由这些基本 的图形进行组合构成了类图的基本符号.这里要注意这几个符号的顺序,代表了类与类之间 ...

最新文章

  1. php传值到模板,laravel 实现向公共模板中传值 (view composer)
  2. SAP HANA云平台YaaS,你不知道的三件事
  3. Android热修复升级探索——SO库修复方案 1
  4. undefined reference to `sqrt‘ 问题
  5. HDU 3534 Tree (经典树形dp)
  6. 谈谈surging引擎的tcp、http、ws协议和如何容器化部署
  7. jquery 鼠标移动 div内容上下或左右滚动
  8. C语言判断点是否在矩阵内
  9. Office系列完全干净卸载工具合集(最全)
  10. 部分拆解笔记本电脑(联想y580)
  11. html+js经纬度输入框值的范围限制和输入限制
  12. 微信小程序加载图片失败展示默认图片
  13. blender导出html,神器,C4D互导插件,可与Maya和Blender模型快速复制粘贴导出脚本Quick CopyPaste (Blender, Maya, C4D)...
  14. 以预测股票涨跌案例入门基于SVM的机器学习
  15. css 效果之并列排列
  16. OCP-1Z0-051 第120题 NATURAL JOIN自然连接
  17. 企培版开发功能 中电集控操作说明
  18. 李斌公开回应“奶妈车”:油能运,怎么就不让运电?
  19. asp.net高校科研项目管理系统
  20. M312: Diagnostics and Debugging chapter 2 Tooling Overview学习记录

热门文章

  1. 小场景带来大提升:“AI之眼”加持工厂品控流水线,质检质量提升80%
  2. 深度学习下的点击率预测:交互与建模
  3. 重磅!2021 高通人工智能应用创新大赛今日开赛
  4. FGPM:文本对抗样本生成新方法
  5. BN究竟起了什么作用?一个闭门造车的分析
  6. 动态规划-KMP字符匹配算法
  7. 线段树之延时标记(区间修改)及lazy思想
  8. Greenplum【集群搭建 01】局域网 CentOS 7.9.2009 环境 GreenPlum 6.13.0 集群规划+配置+安装+内核参数调整(应用实例分享)
  9. 子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...
  10. 十大经典排序算法之冒泡排序及其优化