在软件系统中,类不是孤立存在的,类与类之间存在着各种关系。根据类与类之间的耦合度从弱到强排列,UML中的类图有一下几种关系:依赖关系,关联关系,聚合关系,组合关系,泛化关系和实现关系。其中,泛化和实现关系耦合度相等,是最强的。
1、依赖关系
依赖关系是一种使用关系,他是对象之间耦合度最低的一种关联方式,是临时性的关联。
在代码中,在某个类方法的局部变量,方法的参数或静态方法的调用来访问另一个类(被依赖类)。
在UML类图中,依赖关系用带有虚线的箭头表示,箭头从使用类指向被依赖类。
代码表示:
class MobilePhone
{
public:
void transfer();
}
class Person
{
public:
Person(MobilePhone mp);
void fun()
{
MobilePhone* mp = new MobilePhone;
}
}
类图表示:
2、关联关系
关联关系是对象之间的一种引用关系,表示一类对象于另一类对象之间的联系。比如学生和老师,丈夫与妻子等。关联关系是类与类中最常用的一种关系。分为一般的关联关系,聚合关系,组合关系。这里是一般的关联。关联关系可以是双向的,也可以是单向的。
在代码中,关联关系通常将一个类的对象作为另一个对象的成员变量来实现关联关系。
在UML类图中,双向关联可以用带有双向箭头或者不带箭头的实线表示,单向关联用带箭头的实线表示,箭头从使用类指向被关联类。
代码表示
// 单向关联
class Teacher
{
public:
void teach();
}
class Student
{
public:
void study();
private:
Teacher m_teacher;
}
// 双向关联
class Teacher
{
public:
void teach();
private:
list<Student> stus;
}
class Student
{
public:
void study();
private:
list<Teacher> teas;
}
UML类图表示
单向
双向
3、聚合关系
聚合关系是关联关系的一种,是一种强的关联关系,是整体和部分的关系,是has-a的关系。代码中,与关联关系一样,聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而单独存在。比如学校和老师的关系,学校可以包含老师,但是如果学校停办了,老师依然存在。在UML类图中,聚合关系用带空心的菱形的实线表示,菱形指向整体。
在UML中表示
4、组合关系
组合关系也是一种关联关系,是一种比聚合关系还要强的关联关系,是contains-a的关系。组合关系中,整体对象可以控制部分对象的的生命周期,一点整体对象不存在,部分对象也将不存在。如,头和嘴的关系,头没了,嘴也就没了。在UML类图中,组合关系用带有实心的菱形的实线表示,菱形指向整体。
在UML类图中表示
5、泛化关系
泛化关系是对象之间耦合度最高的一种关系,表示一般与特殊的关系,是父类与子类之间关系,是一种继承关系,是is-a的关系。在UML类图中,泛化关系用空心三角形箭头的实线表示,箭头指向父类。在代码实现时,使用面向对象的继承机制来实现泛化关系。
代码表示
class Person
{
public:
void speak();
private:
string name;
int age;
}
class Student : public Person
{
public:
void study();
private:
long studentNo;
}
class Teacher : public Person
{
public:
void teaching()
private:
long teacherNo;
}
UML类图表示
6、实现关系
实现关系是接口与实现类之间的关系,在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有抽象操作。在UML类图中,实现关系用带有空心三角形的虚线表示,箭头从实现类指向接口。例如,车和船实现了交通工具。