下面我们来讲解以下关联、聚合、组合关系,这三种关系相似度比较大的,所以很多时候容易混淆。本节中将用实例来讲解这三种关系,并分析这三种关系之间的区别。
关联关系
关联关系,顾名思义,就是指两个对象之间存在存在一些对应的关系。
下面我们举一个商城购物的例子,比如我们在某商城购买了一个商品,那么在该商城的后台系统中就会生成一个订单,每个订单就会对应一个用户,这样,订单与用户的关系就是关联关系。
UML类图:
代码实现:
class User {
// 用户信息
// ...
};
class Order {
// 订单信息
// ...
private:
User* user;
};
聚合关系
聚合关系可以简单的理解为A对象拥有B对象,但B对象是独立的,好比于群体和个体之间关系。
继续上面商城购物的例子,每一个订单中,都会存在一个或多个商品的信息,订单和这些商品之间的关系就可以称之为聚合关系。
UML类图如下:
代码实现:
class User {
// 用户信息
// ...
};
class Goods {
// 商品信息
// ...
};
class Order {
// 订单信息
// ...
private:
User* user;
vector<Goods*> goods;
};
这里我们可能容易分不清关联和聚合的区别,在order中用户和商品都是指针的形式存在,但关系却不一样。最主要的区别是,用户是唯一的,不同的订单可能会有相同的用户,所以它不能被订单所拥有,只能与之对应。商品可以存在很多很多的,而且每一个订单所拥有的商品,在其他订单里是不会存在的,这种关系则称之为聚合关系。
组合关系
组合关系,可以理解为A对象包含B对象,B对象是A对象的组成部分,就好比与整体与部分的区别。
比如用户信息,每个用户信息中都有钱包信息和会员信息,这样用户信息与钱包信息、会员信息的关系就是组合关系,UML类图如下所示:
代码如下:
class Wallet {
// 钱包信息
// ...
};
class Vip {
// 会员信息
// ...
};
class User {
// 用户信息
// ...
private:
Wallet wallet;
Vip vip;
};
class Goods {
// 商品信息
// ...
};
class Order {
// 订单信息
// ...
private:
User* user;
vector<Goods*> goods;
};
其实聚合和组合的区别还是非常明显的,聚合关系是把相对独立的对象聚集一块,这些被聚集的独立的对象不会随着聚合对象的销毁而销毁。而组合关系则是不一些相对不独立的部件组合成一个整体,部件会随着整体一起销毁。