依赖,关联,聚合,组合 阐述的是对象之间一种由弱到强的关系
弱 强
---------------------------------------->
UML中关系的符合定义
下面的的类图给出了各种关系的案例,图截取自《大话设计模式》
泛化(Generalization)
父类子类之间的关系,泛化关系用空心三角形 + 实线箭头来表示。
实现接口
实现接口用空心三角形 + 虚线箭头来表示。
关联
当一个类“知道”另一个类时,并且两个类是平等的,无部分-整体之类的特殊关系时,可以用关联(association),通常表现为一个类是另一个类的属性,关联关系用实线或实线箭头表示。对于企鹅和气候两个类,企鹅与气候有很大关联,我们不去讨论为什么北极没有企鹅,为什么它每年要长途跋涉,总之,企鹅需要“知道”气候的变化,需要了解“气候”的规律,它们之间就是一种关联关系。
聚合(Aggregation)
表示类之间的关系是“整体-部分”的关系,但表达的是一种弱的“拥有”关系。聚合关系用空心的菱形 + 实线箭头来表示。
组合(Composition)
是一种特殊的聚合关系,是一种强的“拥有”关系,每个部分只能属于一个整体,部分和整体生命周期一样(
如果说成整体和部分生命周期一样应该是不正确的,不要说反了)。
组合关系用实心的菱形 + 实线箭头来表示,关系的两端还有数字,称为基数,表示关系的这一端的类可以由几个实例,很显然鸟应该有2个翅膀,如果一个类可以由无数个实例,用n来表示。关联关系,聚合关系也是可以由基数的。
依赖(Dependency)
对象之间的临时关系,临时性体现在不超越方法的周期。简单的说,在方法使用到的,如参数类,就一定是依赖关系。在类图中,使用依赖线描述对象之间的全局变量,参数变量,局部变量和静态方法(对其他类的静态方法加以调用)的依赖。
一个事物(独立事物)发生变化会影响使用它的另一个事物(依赖事物),但反之则不然。箭头指向独立事物。
动物需要水,氧气以及食物等,也就是说动物依赖水,氧气,它们之间是依赖关系,用虚线箭头表示。
组合关系是一种强类型关系,表示部分与整体共存亡,整体和部分有一个不存在,另一个也就不应存在,因此类与类之间的耦合度比较高,而聚合关系表示的是一种弱类型关系,整体和部分都可以单独存在。
案例:鸟儿和鸟儿翅膀之间的关系为组合关系,雁群和大雁之间为聚合关系。
另外两个比较重要的关系是关联和依赖:
关联:简单的可以认为,如果一个类作为了另外一个类的属性,那一定是关联关系。但你要知道,
聚合是一种特殊的关联,而组合又是一种特殊的聚合。一般的关联我们认为是平级的、无整体部分关系的,如朋友关系。
关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。
聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。