平常不管是写代码或者是读代码,为了清晰的表示类与类之间的关系,我们需要画UML图。而想要清晰明了的表达类之间的关系,首先要直到它们之间都存在一些什么关系。
简单的说,类与类之间通常有以下这几种关系:
- 继承(Inheritance);
- 实现(Implementation);
- 泛化(Generalization);
- 联合(Association);
- 聚合(Aggregation);
- 组合(Composition)。
继承、实现、泛化都容易理解,但是联合、聚合、组合有什么区别呢?这里使用下面的例子来说明。
class Bed;
class Chair;
class Table;
class Cup;
class Room {
public:
Room(Bed *bed = nullptr, Chair *chairs = nullptr, Table *table = nullptr):
bed_(bed), chairs_(chairs), table_(table) {}
private:
Bed *bed_;
Chair *chairs_;
Table *table_;
};
class House {
public:
House() {}
private:
Room room;
};
class Bed {};
class Chair {};
class Table {
public:
Table() {}
void support(Cup &cup) {}
};
class Cup {
public:
Cup() {}
void decorate(Table &table) {}
};
Composition
组合表示类B是类A的一部分,并且类B的生命周期依赖与类A,如果类A被销毁了,那么类B也将随之被销毁。
例如房间是一栋房子的一部分,房子如果没有了,房间也就没有了。
class Room {
public:
Room() {}
};
class House {
public:
House() {}
private:
Room room;
};
组合的UML表示方法如下图所示:
Composition
Aggregation
聚合用于表示类B是类A的一部分,或者说类A中含有类B,但与组合不同的是,类B的声明周期并不依赖与类A。类A被销毁了类B 仍然可以继续存在。
例如房间里的桌椅板凳在房间被拆了仍然可以继续存在。
class Bed {};
class Table {};
class Chair {};
class Room {
public:
Room(Bed *bed = nullptr, Chair *chairs = nullptr, Table *table = nullptr):
bed_(bed), chairs_(chairs), table_(table) {}
private:
Bed *bed_;
Chair *chairs_;
Table *table_;
};
聚合的UML表示方法如下图所示:
AggregationAssociation
联合表示两个类之间存在一种交互关系,而它们本身并不存在谁包含谁的关系。
class Table {
public:
Table() {}
void support(Cup &cup) {}
};
class Cup {
public:
Cup() {}
void decorate(Table &table) {}
};
联合的UML表示方法如下图所示:
Association 本文首发于个人微信公众号TensorBoy,微信扫描上方二维码或者微信搜索TensorBoy并关注,及时获取最新文章。C++ | Python | 推理引擎 | AI框架源码,有一起玩耍的么?
网友评论