jayhgq 2012-12-12
UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。
其中依赖(Dependency)的关系最弱,而关联(Association),聚合(Aggregation),组合(Composition)表示的关系依次增强。换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。
而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系,而关联描述了对象之间的结构关系。
后面的例子将针对某个具体目的来独立地展示各种关系。虽然语法无误,但这些例子可进一步精炼,在它们的有效范围内包括更多的语义。
1、依赖关系也是类与类之间的联结
2、依赖总是单向的。(#add注意,要避免双向依赖。一般来说,不应该存在双向依赖。)
3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。class Person { void buy(Car car) { ... } } |
虚线加箭头
1、关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。
2、关联可以是双向的,也可以是单向的(#add还有自身关联)。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
3、在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。class 徒弟 { }; class 唐僧 { protected: list<徒弟> tdlist; }; |
1、聚合关系是关联关系的一种,是强的关联关系。
2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。
4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。class 引擎 { }; class 轮胎 { }; class 汽车 { protected:引擎 engine; protected:轮胎 tyre[4]; }; |
1、合成关系是关联关系的一种,是比聚合关系还要强的关系。2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
class 肢 { }; class 人 { protected: 肢 limb[4]; }; |
一般是实心菱形加实线箭头表示
一般化关系(泛化和实现):表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化关系是子类指向父类的,或从实现接口的类指向被实现的接口,与继承或实现的方向相反。如下图所示:
图:一般化关系
泛化(图H)表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。在Java中,用extends关键字来直接表示这种关系。
泛化关系表示类与类之间的继承关系,接口与接口之间的继承关系。图H
1.1.6 实现(Realization):空心箭头和虚线表示
实例(图I)关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。
图I
1、泛化(继承)
实线箭头表示继承一个基类B类继承A类
2、实现
虚线箭头表示实现一个接口:C类实现接口Interface(现在好像显示成线了没有了箭头)
3、关联
关联分为单向和双向关联两种。
关联和类的属性很相似。
3.1单向关联:仅能从一个类访问另一个类(前者的属性中有后者)
B类单向关联A类(B中有属性a为A的对象)
3.2双向关联:两个类之间能相互访问(两个类的属性中都有对方)
B类关联A类(B中有属性a为A的对象)
A类关联B类(A中有属性b为B的对象的数组)
A和B是1对n(n>0)的关联
3.3聚合关系
由上图知道,Wheel类扮演wheels角色,聚合4个到Car对象里面去
空心的菱形表示Wheel对象并不随Car的创建而创建,销毁而销毁。
3.4组合关系
由上图知道,Company类完全由Department对象组成。
实心菱形表示Department对象随Company对象的创建而创建,销毁而销毁。
4、依赖
依赖指的是类之间的调用关系,在UML中用带虚线的箭头表示。如果类A访问类B的属性或者方法,
或者类A负责实例化类B,那么可以说类A依赖类B。和关联关系不同,无须在类A中定义类B类型的属性。