(软件设计) has-a 的三种形式(组合、聚合、关联)

发布于:2025-02-13 ⋅ 阅读:(97) ⋅ 点赞:(0)

👣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)
定义 表示部分对象的生命周期完全由整体对象控制。部分对象不能独立于整体对象存在。
依赖性 强依赖。
示例解释 EngineCar的一部分,Car 的生命周期决定了 Engine 的生命周期。
实现方式 一般直接在对象直接构造,或转移所有权。
聚合(Aggregation)
定义 表示部分对象可以独立于整体对象存在。整体对象不控制部分对象的生命周期。
依赖性 弱依赖。
示例解释 Wheel 对象在 Car 外部创建,并传递给 CarWheel的生命周期独立于Car
实现方式 一般采用指针或引用。
关联(Association)
定义 表示类之间的某种联系,可以是单向或双向的,描述对象之间的交互。
依赖性 弱依赖。
示例解释 DriverCar是有关联的,也可以没有关联。
实现方式 一般采用指针或引用。

👣UML 表示

关系 表示
组合(Composition) 实心菱形
聚合(Aggregation) 空心菱形
关联(Association) 箭头
Composition
1
1
Aggregation
1
1
Association
1
0..1
Engine
+start()
Wheel
+rotate()
Driver
-name: string
+Driver(name: string)
Car
-engine: Engine
-wheel: Wheel*
-driver: Driver*
+Car(wheel: Wheel*)
+sitDown(driver: Driver*)
+start()
+run()

在类图中,耦合度从弱到强排序为:

  • 依赖关系(Dependency)
  • 关联关系(Association)
  • 聚合关系(Aggregation)
  • 组合关系(Composition)
  • 泛化关系(Generalization)
  • 实现关系(Realization)



⭐END

🌟交流方式

关注我,学习更多C/C++,python,算法,软件工程,计算机知识!

⭐交流方式⭐ |C/C++|算法|设计模式|软件架构-CSDN社区

B站

👨‍💻主页:天赐细莲 bilibili


网站公告

今日签到

点亮在社区的每一天
去签到