最近在看博客,里面涉及到很多的类图,流程图,虽然说以前学过UML相关的课程,但毕竟过了这么久了,对这几种概念早已模糊不清了,所以索性借着这次看博客的时间,把这几种概念再重新梳理总结一遍,以备再次查看之用。
一、泛化(Generalization)
泛化,是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有特征和行为。在Java中此类关系通过关键字extends明确标识。
例如:猫是动物的一种, 它既有猫的特性也有动物的共性。
箭头指向:带三角箭头的实线,箭头指向父类。
二、实现(Realization)
实现,是一种类与接口的关系, 表示类是接口所有特征和行为的实现.在Java中此类关系通过关键字implements明确标识。
例如:哺乳动物中蝙蝠(对象)会飞(接口),而一般的哺乳动物都不会飞。
箭头指向:带三角箭头的虚线,箭头指向接口。
三、组合(Composition)
组合是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它是整体与部分的关系,但部分不能离开整体而单独存在。
例如:公司和部门是整体和部分的关系,没有公司就不存在部门。
箭头指向:带实心菱形的实线,菱形指向整体。
public class Company
{
private Department mDepartment;
public Company()
{
mDepartment = new Department();
}
......
}
public class Department
{
......
}
四、聚合(Aggregation)
聚合也是关联关系的一种特例,它体现的是一种has-a的关系,这种关系比依赖强,也是一种整体和部分的关系,但整体与部分是可以分开的,它们拥有各自的生命周期。
例如:如车与轮胎、公司与员工的关系等。
箭头指向:带空心菱形的实心线,菱形指向整体。
public class Car
{
private Engine mTyre;
public Car(Tyre tyre)
{
this.mTyre = tyre;
}
}
public void setTyre(Tyre tyre)
{
this.mTyre = tyre;
}
public class Tyre
{
......
}
五、关联(Association)
关联是类与类或类与接口之间语义级别的一种强依赖关系,它使一个类知道另一个类的属性和方法。这种关系一般是长期的,而且双方的关系一般是平等的、关联可以是单向的或者双向的。双向关联有两个箭头或没有箭头,单向关联有一个箭头。
例如:老师与学生,我和我的朋友,一名学生需要上多门课程等。
箭头指向:带普通箭头(或实心三角形箭头)的实心线,指向被关联元素。
public class Teacher
{
private List<Student> mStudentList;
}
public class Student
{
......
}
代码中的体现主要是成员变量的关系,为被关联类Student以类属性的形式出现在关联类Teacher中,当然也可能是关联类引用了一个类型为被关联类的全局变量。
六、依赖(Dependency)
依赖是一种使用关系,即一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A类,它是一种单向关系。
例如:人与车就是一种依赖关系。
箭头指向:带箭头的虚线,指向被依赖元素。
public class Person
{
void buy(Car car)
{
......
}
}
public class Car
{
......
}
依赖在代码中的体现主要是局部变量、方法的参数或者对静态方法的调用。描述的是对象之间的调用关系,这一点与关联不同(关联描述的是对象之间的结构关系),一般来说要尽量避免双向依赖。
总结
几种关系之间的强弱顺序为:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖