原文来自:http://www.cnblogs.com/duanxz/archive/2012/06/13/2547801.html
我只是复习整理并添加详解而已,我根据初学者阅读慢慢往下学习——所以说适合初学者,大牛可以忽略。
所有的关系有:
UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。
依赖(Dependency):元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。
B--->A 表示B依赖A,故A的变化当然会影响B。
符号表示:虚线箭头表示 ---------->
1、依赖关系也是类与类之间的联结
2、依赖总是单向的。(注意,要避免双向依赖。一般来说,不应该存在双向依赖。)
3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。
局部变量:
class Person { Void Buy() { Car car; } }
方法的参数:
class Person { void buy(Car car) { … } }
对静态方法的调用:(这个如果有错误请指正)
class Car { public: static void Say() { cout<<"I'm running!"<<endl; } }; class Person { public: void PersonSay() { Car::Say(); } };
PS:人依赖车,车的变化会影响到人的出行,以及花费等等。
- 关联(Association):元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。
符号表示:实线箭头表示
1、关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。
2、关联可以是双向的,也可以是单向的(还有自身关联)。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
3、在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。
class 徒弟 { }; class 唐僧 { protected: list<徒弟> tdlist; };
PS:唐僧关联徒弟,徒弟这里可以有多个,故写1对多。
- 聚合(Aggregation):关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。
符号表示:带空心菱形实线箭头表示
1、聚合关系是关联关系的一种,是强的关联关系。
2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。
4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。
class 引擎 { }; class 轮胎 { }; class 汽车 { protected: 引擎 engine; protected: 轮胎 tyre[4]; };
PS:汽车由包含引擎和轮胎等。我觉得这篇博文讲的十分到位,聚合首先要记住的是符号(空心菱形带箭头指向),然后就是聚合是强关联,在C++代码层面上是看不出谁是谁的,这个空心菱形是有道理的,就是单独的一个是空壳的,部分组装起来才是整体,就像这边的例子,汽车是整体,而引擎对于汽车来说是一部分,只有引擎没有其他的,对于整体汽车来说是空荡荡的,还没组装完整,这个说法只是便于记忆,没有其他意思。要记住整体与部分,层次不同。
- 组合(Composition):组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。
符号表示:带实心菱形实线箭头表示
1、合成关系是关联关系的一种,是比聚合关系还要强的关系。
2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
class 肢 { }; class 人 { protected: 肢 limb[4]; };
PS:第二点说的太棒了,举的例子也是相当棒!实心的菱形可以这样记忆,都是实实在在的肉(关系好)啊,呵呵~~~~
一般化关系(泛化和实现):表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化关系是子类指向父类的,或从实现接口的类指向被实现的接口,与继承或实现的方向相反。如下图所示:
- 泛化(Generalization):通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。
- 实现(Realize):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。
PS:上面两个关系已经相当清楚了,不用多作解释了。
其中依赖(Dependency)的关系最弱(函数参数、局部变量、静态方法调用),而关联(Association)(成员变量),聚合(Aggregation)(成员变量),组合(Composition)(成员变量)表示的关系依次增强。换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。
PS:这句话说的很棒,在聚合关系中的例子来说,引擎是可以单独发动的,可以给小汽车也可以给面包车,那么聚合关系的成员变量一般是指针,这样的话就比较贴切了。
而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系(PS:在类中不会长久存在,就局部的存在而已,不与类拥有同样的生命周期(理解用)。),而关联描述了对象之间的结构关系(例子:部门结构等)。
后面的例子将针对某个具体目的来独立地展示各种关系。虽然语法无误,但这些例子可进一步精炼,在它们的有效范围内包括更多的语义。
注:上面看清楚是局部变量还是成员变量。
最后,感谢原作者!