关联(Association)关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学生等等。在UML类图中,用实线连接有关联关系的对象所对应的类。 通常将一个类的对象作为另一个类的成员变量。在使用类图表示关联关系时可以在关联线上标注角色名,一般使用一个表示两者之间关系的动词或者名词表示角色名(有时该名词为实例对象名),关系的两端代表两种不同的角色,因此在一个关联关系中可以包含两个角色名,角色名不是必须的,可以根据需要增加,其目的是使类之间的关系更加明确。
单向关联
一个只包含另一个的关系为单向关联,也就是一厢情愿。
class Button
{
public:
...
};
class View
{
private:
Button btn;
};
双向关联
也就是类与类之间相互包含彼此相辅相成而存在,就好比夫妻关系一样,好朋友的关系一样,你是我的好朋友,我也是你的好朋友等等。
class Wife
{
public:
void make_baby(...);
private:
Husband* self_husband;
};
class Husband
{
public:
void work(...);
private:
Wife* self_wife;
};
自关联
在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联 。这种关系表现为递归关系,如目录结构等等
class Tree
{
public:
Tree* left;
Tree* right;
private:
int data;
};
多重性关联
多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示
class People
{
public:
void work();
};
class Factory
{
protected:
std::list<People> workers;
};
聚合关系
聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示
class Bullet
{
public:
void boom();
};
class Tank
{
public:
Tank(Bullet* b);
void setBullet(Bullet*);
void shoot();
protected:
Bullet* current_bullet;
};
组合关系
组合(Composition)关系也表示类之间整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。在UML中,组合关系用带实心菱形的直线表示
class Eyes
{
public:
void blink();
};
class People
{
public:
Eyes eyes;
};