👣has-a
在软件设计中有一句设计原则“组合优于继承”。继承通常用is a
表示,组合通常用has a
表示。
但要更进一步了解has a
的话,可以再继续细分为三种类型:
- 组合(Composition)
- 聚合(Aggregation)
- 关联(Association)
👣组合、聚合、关联
我们直接来看一个例子,用一个汽车类来进行表述。
#include <iostream>
#include <string>
// 引擎
struct Engine {
void start() {
std::cout << "Engine started" << std::endl;
}
};
// 轮子
struct Wheel {
void rotate() {
std::cout << "Wheel rotating" << std::endl;
}
};
// 驾驶员
struct Driver {
std::string name;
Driver(const std::string& name) : name(name) {}
};
// 车
class Car {
private:
Engine engine; // Car has an Engine (Composition relationship)
Wheel* wheel = nullptr; // Car has a Wheel (Aggregation relationship)
Driver* driver = nullptr; // Car is associated with a Driver (Association relationship)
public:
Car(Wheel* wheel) : wheel(wheel) {}
void sitDown(Driver* driver) {
this->driver = driver;
}
public:
void start() {
if (driver) {
std::cout << driver->name << "'s Car ";
}
engine.start();
}
void run() {
if (driver) {
std::cout << driver->name << "'s Car ";
}
wheel->rotate();
}
};
int main() {
Driver dirver("cuber-lotus");
Wheel wheel;
Car car(&wheel);
car.sitDown(&dirver);
car.run();
}
汽车必须要有一个引擎,当然车要跑也需要轮子。而车可以作为一个独立的对象,即使没有人也可以基于自动驾驶等技术来实现无人驾驶。
而这里正好有三个有关的内容,引擎,轮子,驾驶员。
组合(Composition) | |
---|---|
定义 | 表示部分对象的生命周期完全由整体对象控制。部分对象不能独立于整体对象存在。 |
依赖性 | 强依赖。 |
示例解释 | Engine 是Car 的一部分,Car 的生命周期决定了 Engine 的生命周期。 |
实现方式 | 一般直接在对象直接构造,或转移所有权。 |
聚合(Aggregation) | |
---|---|
定义 | 表示部分对象可以独立于整体对象存在。整体对象不控制部分对象的生命周期。 |
依赖性 | 弱依赖。 |
示例解释 | Wheel 对象在 Car 外部创建,并传递给 Car ,Wheel 的生命周期独立于Car 。 |
实现方式 | 一般采用指针或引用。 |
关联(Association) | |
---|---|
定义 | 表示类之间的某种联系,可以是单向或双向的,描述对象之间的交互。 |
依赖性 | 弱依赖。 |
示例解释 | Driver 与Car 是有关联的,也可以没有关联。 |
实现方式 | 一般采用指针或引用。 |
👣UML 表示
关系 | 表示 |
---|---|
组合(Composition) | 实心菱形 |
聚合(Aggregation) | 空心菱形 |
关联(Association) | 箭头 |
在类图中,耦合度从弱到强排序为:
- 依赖关系(Dependency)
- 关联关系(Association)
- 聚合关系(Aggregation)
- 组合关系(Composition)
- 泛化关系(Generalization)
- 实现关系(Realization)
⭐END
🌟交流方式
关注我,学习更多C/C++,python,算法,软件工程,计算机知识!
B站
👨💻主页:天赐细莲 bilibili
![]()