UML中几种类间关系Word文件下载.docx
《UML中几种类间关系Word文件下载.docx》由会员分享,可在线阅读,更多相关《UML中几种类间关系Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;
这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;
表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;
聚合
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;
比如计算机与CPU、公司与员工的关系等;
表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
组合
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;
他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;
比如你和你的大脑;
对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;
其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;
但总的来说,后几种关系所表现的强弱程度依次为:
组合>
聚合>
关联>
UML关系
UML定义的关系主要有6种:
依赖,泛化,关联,实现,聚合和组合。
泛化(Generalization):
通常所说的继承关系。
UML中用带空心箭头的实线表示Generalization关系,箭头指向一般个体。
实现(Realize):
元素A定义一个约定,元素B实现这个约定,则B和A的关系实Realize,BrealizeA。
这个关系最常用于接口。
UML中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。
依赖(Dependency):
元素A的变化会影响B,但反之不成立,那么B和A是依赖关系,B依赖A;
类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。
UML中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。
关联(Association):
元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。
聚合(Aggregation):
关联关系的一种特例,表示部分和整体的关系。
UML中通常用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。
组合(Composition):
组合是聚合关系的变种,表示元素间更强的组合关系。
如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。
UML中用带实心菱形头的实线表示Compositon关系,菱形头指向整体。
下面将以实例来展示各种关系。
依赖(Dependency)
实体之间一个“使用”关系暗示一个实体的规范发生变化后,可能影响依赖于它的其他实例。
更具体地说,它可转换为对不在实例作用域内的一个类或对象的任何类型的引用。
其中包括一个局部变量,对通过方法调用而获得的一个对象的引用,或者对一个类的静态方法的引用。
也可利用“依赖”来表示包与包之间的关系。
由于包中含有类,可以根据那些包中各个类之间的关系,表示出包与包之间的关系。
关联(Association)
实体之间的一个结构化关系表明对象是相互连接的。
箭头是可选的,它用于指定导航能力。
如果没有箭头,暗示是一种双向的导航能力。
多重度(Multiplicity)修饰符暗示着实例之间的关系。
在示范代码中,Employee可以有0个或更多的TimeCard对象;
但是,每个TimeCard只从属于单独一个Employee。
聚合(Aggregation)
聚合是关联的一种形式,代表两个类之间的整体/局部关系。
聚合暗示着整体在概念上比局部更高的一个级别,而关联暗示两个类上位于相同的级别。
关联和聚合的区别粗纯粹是在概念上的,而且严格反应在语义上。
聚合还暗示着实例图中不存在回路。
换言之,只能是一种单向关系。
合成(Compositon)
合成是聚合的一种特殊形式,暗示“局部”在“整体”内部的生存期职责。
合成也是非共享的。
所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。
局部不可与其他整体共享。
但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。
Employee和TimeCard的关系或许更适合表示成“合成”,而不是表示成“关联”。
(以下代码privateTimeCardtc;
应改成TimeCardtc=newTimeCard;
)
泛化(Generalization)
泛化表示一个更泛化的元素和一个更具体的元素之间的关系。
泛化是用于对继承进行建模的UML元素。
实现(Realization)
实现关系指定两个实体之间的一个合同。
换言之,一个实体定义一个合同,而另一个实体保证履行该合同。
UML中的“关系”总结
UML中,事物之间的联系方式,无论是物理上的,还是逻辑上的,都用“关系(relationship)”来建模。
在面向对象的建模中,将“关系”细分为三种:
依赖、泛化、关联。
下面分别说明。
1、
依赖(dependency)
依赖是一种使用关系。
它表示一个事物的变化会影响到所有使用它的事物的行为。
在UML图形表示法中,依赖用一个带方向的虚线来表示,箭头指向被依赖的事物。
针对面向对象的“类”来说,如果一个类A使用另外一个类B作为其函数的参数,或者作为本地变量,那么就说A依赖于B。
事实上,“依赖”关系不仅仅在类之间存在,UML中的“包”之间也经常存在这种关系。
2、
泛化
泛化是一种“is-a”的关系,它表示一般事务(父类)和该事物的更具体更特殊的类(子类)之间的一种关系。
在图形上,泛化用一条带有空心大箭头的有向实线来表示,箭头方向指向父类。
作为延伸,或者说是一种特殊的“泛化”,出现了事务之间的另外一种关系,即“实现(realization)”。
在类的实现关系中,一个类描述了另外一个类必须实现的契约,即接口。
也有人说,实现是一种和泛化、依赖都不同的另外一种关系,但不可否认的是,实现和泛化、依赖有着千丝万缕的联系,它是泛化和依赖在语义上的结合;
从某种程度上说,可以认为实现是一种泛化,也可以认为实现是一种“依赖”。
因此,在图形上,实现就用泛化和依赖的结合形式来表示:
用带有空心大箭头的虚线来表示,箭头指向描述契约的那个类。
以上这种形式是实现的规范描述形式,另外针对实现关系,还有一种省略方式:
用接口的棒棒糖型表示法——你看到那个大大的棒棒糖了吗?
3、
关联(association)
关联表示的是一种结构关系。
它描述了一个事物与另外一个事物的对象之间的拥有关系。
例如Library类和Book类之间具有一个一对多的关联关系,它表明一个Library可以有多个Book,但是一个Book仅仅只能被一个Library所拥有。
在图形上,关联使用细的实线来表示。
一般地,用细实线连接起来的两个类是双向导航的,也就是说可以从一个类导航到另外一个类。
举例来说,Person类和Company类就是双向导航的。
但是,有时也可以讲导航限制为单项的,例如User类和Password类——我们可以从User类导航到Password类,但是不能从Password类导航到User类。
这种单向的导航关系,在图形上用带有箭头的实现来表示,箭头的方向表示导航的方向。
上述的简单关联,表示被关联的两个类在概念上其地位是相等的,谁也不比谁中要。
然而,有些类之间具有“整体/部分”的关系,也就是说,一个大的整体由较小的部分组成。
在UML中,表示这种“组成”关系的建模方式有两种:
聚合和组合。
聚合(aggregation)
聚合表示一种has-a的关系,暗示着较大的对象拥有这较小的对象,然而这种拥有关系不是那种一损俱损的强拥有关系,也就是说,“大对象”的生命期结束的时候,“小对象”的生命期并不受影响。
举例来说,机场和飞机就是这种聚合关系。
在图形上,聚合用一个空心的菱形加上实线来表示,菱形放置在表示整体的类的那端。
组合(composition)
组合关系是对聚合关系的加强,它说明大对象不仅仅拥有小对象,而且他们是一个有机体,具有共同的生命周期,一损俱损。
例如汽车和车轮就是这种关系。
在图形上,组合使用实心的菱形和实线来表示。
UML类图关系
1.关联
A->
B关联表示相识关系,实际表现为类A知道类B的存在,它可以调用类B的公共属性和方法,但没有生命周期的依赖。
代码表现为:
ClassA
{
Public:
B*b;
};
ClassB
};
类图为表现为:
#存在双向关联和自身关联
2.组合/聚合
组合/聚合是整体与部分的关系。
类A聚合类B,类B可以脱离类A独立存在。
Bb;
类图表现为:
类A组合类B,类A需要知道类B的生存周期,即类A可能控制类B的生成和释放,或者通过某种方式知道类B的生成和释放。
代码表现与聚合相同,类图表现为:
3.依赖
类A依赖类B,那么类A可能需要用到类B的一些方法,要完成类A的所有功能,一定要类B的方法的协助才行,不产生属性,一般是类A的头文件中包含类B的头文件,实际表现为类A的一些方法可能需要把类B作为参数使用。
//A.h
#include“B.h”
VoidFunc(B*b);
//B.h
}
关联是类之间的一种关系,例如老师教学生,老公和老婆,水壶装水等就是一种关系。
这种关系是非常明显的,在问题领域中通过分析直接就能得出。
依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖,依赖也