建模常用方式:组合与聚合

    技术2025-08-18  16

    组合:

    举例: 需求: 构建一个计算机类,一台计算机,由CPU芯片,硬盘,内存等组成。 CPU芯片也使用类来表示。 因此,计算机和CPU的关系是组合。 CPU.h

    #include <string> class CPU { public: CPU(const char *brand = "intel", const char *version="i5"); ~CPU(); private: std::string brand; //品牌 std::string version; //型号 };

    CPU.cpp

    #include "CPU.h" #include <iostream> CPU::CPU(const char *brand, const char *version) { this->brand = brand; this->version = version; std::cout << __FUNCTION__ << std::endl; } CPU::~CPU() { std::cout << __FUNCTION__ << std::endl; }

    Computer.h

    #include "CPU.h" class Computer { public: Computer(const char *cpuBrand, const char *cpuVersion, int hardDisk, int memory); ~Computer(); private: CPU cpu; // Computer和CPU是“组合”关系 // CPU *cpu; //组合的另一种表达方式 int hardDisk; //硬盘, 单位:G int memory; //内存, 单位:G };

    Computer.cpp

    #include "Computer.h" #include <iostream> Computer::Computer(const char *cpuBrand, const char *cpuVersion, int hardDisk, int memory):cpu(cpuBrand, cpuVersion) { this->hardDisk = hardDisk; this->memory = memory; std::cout << __FUNCTION__ << std::endl; } Computer::~Computer() { std::cout << __FUNCTION__ << std::endl; }

    上述的Computer类中CPU的类成员,可以表示为:CPU *cpu;只是这样的话Computer类的构造函数需要为其申请空间,如this->cpu= new CPU(cpuBrand, cpuVersion);,在Computer类中的析构函数释放该内存。

    被拥有的对象(CPU)的生命周期与其拥有者(Computer)的生命周期是一致的。

    Computer被创建时,CPU也随之创建。 Computer被销毁时,CPU也随之销毁。

    拥有者需要对被拥有者负责,是一种比较强的关系,是整体与部分的关系。

    具体组合方式:

    1)被组合的对象直接使用成员对象。(常用)

    2)使用指针表示被组合的对象,在构造函数中,创建被组合的对象;在析构函数中,释放被组合的对象。 UML中的组合表示:

    聚合:

    需求:假如需要给计算机配置一台音响。 计算机与音响之间是聚合关系,计算机消亡后,音响还是可以存在的,可以和其他的计算机或者手机聚合使用。

    示例代码: Computer.h

    #include "CPU.h" class VoiceBox; class Computer { public: Computer(const char *cpuBrand, const char *cpuVersion, int hardDisk, int memory); ~Computer(); void addVoiceBox(VoiceBox *box); private: CPU cpu; // Computer和CPU是“组合”关系 int hardDisk; //硬盘, 单位:G int memory; //内存, 单位:G VoiceBox *box; //音箱 };

    Computer.cpp

    #include "Computer.h" #include <iostream> #include "VoiceBox.h" Computer::Computer(const char *cpuBrand, const char *cpuVersion, int hardDisk, int memory):cpu(cpuBrand, cpuVersion) { this->hardDisk = hardDisk; this->memory = memory; std::cout << __FUNCTION__ << std::endl; } void Computer::addVoiceBox(VoiceBox *box) { this->box = box; } Computer::~Computer() { std::cout << __FUNCTION__ << std::endl; }

    Main.cpp

    #include <iostream> #include <Windows.h> #include <string> #include <string.h> #include "Computer.h" #include "VoiceBox.h" using namespace std; void test(VoiceBox *box) { Computer a("intel", "i9", 1000, 8); a.addVoiceBox(box); } int main(void) { VoiceBox box; test(&box); system("pause"); return 0; }

    聚合不是组合关系,被包含的对象,也可能被其他对象包含。 拥有者,不需要对被拥有的对象的生命周期负责。 当需要的时候,被拥有者指针只是指向了拥有者,当拥有者消亡的时候只是取消了这种指针指向关系。

    UML中聚组合表示:

    Processed: 0.012, SQL: 9