新博客地址
准备写技术博客,发现UML画不出来,在这里捋一下UML各种类图关系,基于UML类图几种关系的总结,在此基础上做了归纳总结!
Process On一款非常好的UML在线编辑工具,made in China
在UML类图中,常见几种关系: 1.泛化(Generalization_FY:概括)(继承 : 空三角 + 直线) 2.实现(Realization_FY实现)(接口实现 : 空三角 + 虚线) 3.关联(Association_FY协会)(直线 + 箭头(箭头可无)) 4.聚合(Aggregation_FY聚合)(整体与部分的关系,且部分可以离开整体而单独存在)(空菱形 + 直线 + 方向) 5.组合(Composition_FY组合)(整体与部分的关系,但部分不能离开整体而单独存在)(实菱形 + 直线 + 方向) 6.依赖(Dependency_FY依赖)(虚线 + 箭头) 类与类之间由弱到强关系是: 没关系 > 依赖 > 关联 > 聚合 > 组合。
1.泛化(Generalization)
【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
【箭头指向】:带三角箭头的实线,箭头指向父类
2.实现(Realization)
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现.
【箭头指向】:带三角箭头的虚线,箭头指向接口
3.关联(Association)
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量
【箭头及指向】:带普通箭头的实心线,指向被拥有者
上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。
下图为自身关联:
4.聚合(Aggregation)
【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体
5.组合(Composition)
【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。
组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
【代码体现】:成员变量
【箭头及指向】:带实心菱形的实线,菱形指向整体
6.依赖(Dependency)
【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.
【箭头及指向】:带箭头的虚线,指向被使用者
各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
下面这张UML图,比较形象地展示了各种类图关系:
这里重点说下依赖与关联的区别
依赖(dependency) 可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用。用带虚线的箭头。 关联(association) 他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;
依赖就像一夜情,依赖就是使用XX干了YY(仅仅是用了Ta的一个方法),关联是夫妻,你所有的都是你老婆的(你是你老婆的成员变量)
依赖就是对象偶然需要其它对象的某个方法或者某个属性,而关联是方向性的拥有关系,拥有那个对象,拥有那个对象的所有对外属性以及对外方法,完全深度拥有。