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

👣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++|算法|设计模式|软件架构-优快云社区

B站

👨‍💻主页:天赐细莲 bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天赐细莲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值