UML的构造快包含三种:
1.事物:结构事物,行为事物,分组事物,注释事物
2关系:泛化关系,实现关系,依赖关系,关联关系
3图:用例图,类图,对象图,包图,组建图,部署图,状态图,活动图,序列图,写作图
关系 (4种)
UML中类与类,类与借口,接口与接口之间的关系有:泛化 generalization 、关联 association(聚合 aggregation、组合composition)
、依赖(dependency)关系,实现(realization)关系。
泛化关系是一个类继续另外的一个类的功能并可以增加自己的新功能的能力,继承是类与类或者接口与接口之间
最常见的关系;在JAVA中次类关系通过关键字extends明确标识,在设计时一般没有针对性
实现关系(realization)关系指的是一个class实现interface接口的功能;实现是类与接口最常见的关系;在java中通常用关键字implements标识
依赖(dependency)关系:也是类与类之间的关系:表示一个类依赖于另一个类的定义。依赖关系总是单向的。
可以简单的理解就是一个类A使用到了一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的。但是B类的
变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层次,为java中
关联关系(association)关系:标识类与类之间的连接,它是一个类知道另一个类的属性和方法。
关联可以使用单箭头标识单向关联,使用双箭头或不实用箭头表示双向关联关联有两个端点,在每个端点可以有一个基数
,表示这个关联的类可以有几个实例。他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的
朋友;这种关系比依赖更强,不存在依赖的偶然性、关系也不是临时性的、一般是长期性的。而且双方的关系一般是平等的
表现在代码层面为被关联类B以属性的形式出现在A类中,也可能是关联类A引用了一个类型为被关联类型B的全家变量;
在java语言中关联关系是使用实例变量出现的。
聚合(aggregation)关系:关联关系的一种特例,强的关联关。聚合是整体与个体之间的关系即has-a的关系
此时整体与部分之间是可分离的,他们可以有自己的生命周期,部分可以属于多个整体对象,也可以为多个整体对象
共享;比如计算机和cpu、公司与员工的关系;变现在代码层面和关联关系是一致的,只能从语义级别来区分;
聚合关系也是使用实例变量实现的。从java语法上是分不出关联和聚合的。
关联关系中两个类是处于相同的层次,而聚合关系中两个类处于不平等的层次一个标识整体,一个标识部分。
组合关系(composition):也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强
也成为强聚合;他同样也体现整体与部分之间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着
部分的生命周期结束;比如你和你的大脑;合成关系不能共享,表现在代码层面,和关联关系是一致的,只能在 语义级别
来区分。组合跟聚合几乎相同,唯一的区别就是“部分不能脱离整体”单独存在,也就是说部分的生命周期不能比整体还长。
总结:
对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;
其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,
有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,
所以从代码层面并不能完全区分各种关系;但总的来说,
后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。