依赖(Dependency)
虚线
student ---------> Computer
class Computer{
public:
static void start(){
cout<<"电脑正在启动"<<endl;
}
};
class Student{
public:
//返回值构成依赖
Computer& program();
//形参构成依赖
void program(Computer&);
//局部变量构成依赖
void playGame(){
Computer* computer=new Computer;
...
}
//静态方法调用构成依赖
Computer::star();
};
关联(Association)
实线
student ————————> Teacher
class Teacher;
class Student{
public:
Teacher teacher; //成员变量
void study();
}
聚合(Aggregation)
Classes 空心菱形—————————— Student
class Student;
class Classes{
public:
Student* student;
Classes(Student* stu):student(stu){}
};
组合(复合,Composition)
student 实心菱形———————— Heart
class Heart;
class Student{
public:
Heart* heart;
Student(){
heart=new Heart;
}
~Student(){
delete heart;
}
};
泛化(Generalization)
human
空心三角 空心三角
| |
student teacher
继承(Inheritance)
实线空心三角
实现(Realization)
虚线空心三角
结论
依赖、关联、聚合、组合与泛化代表类与类之间的耦合度依次递增。依赖关系实际上是一种比较弱的关联,聚合是一种比较强的关联,组合是一种更强的关联,泛化则是一种最强的关联,所以笼统的来区分的话,实际上这五种关系都是关联关系。
依赖关系比较好区分,它是耦合度最弱的一种,在编码中表现为类成员函数的局部变量、形参、返回值或对静态方法的调用。
关联、聚合与组合在编码形式上都以类成员变量的形式来表示,所以只给出一段代码我们很难判断出是关联、聚合还是组合关系,我们需要从上下文语境中来判别。
关联表示类之间存在联系,不存在集体与个体、个体与组成部分之间的关系。聚合表示类之间存在集体与个体的关系。组合表示个体与组成部分之间的关系。
依赖、关联、聚合与组合是逻辑上的关联,泛化是物理上的关联。物理上的关联指定是类体的耦合,所以类间耦合性最强。