一:UML类图
类之间的关系
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
学习设计模式的第一步是看懂UML类图,类图能直观的表达类、对象之间的关系,这将有助于后续对代码的编写。
常见的类之间的关系包括:继承(泛化)、实现、关联、聚合、组合、依赖。
文章目录
- 类之间的关系
- 二、关系定义及示例
- 1.继承(泛化)
- 2.实现
- 3.关联
- 4.聚合
- 5.组合
- 6.依赖
- 总结
二、关系定义及示例
1.继承(泛化)
语义:子类继承父类的属性和方法(is-a关系)
画法:空心三角形箭头(子类指向父类)
class Animal {};
class Dog : public Animal {}; // C++
2.实现
语义:类实现接口的方法
画法:空心三角形虚线箭头
class Flyable { virtual void fly() = 0; };
class Bird : public Flyable {}; // C++
3.关联
语义:类之间长期稳定的关系(如成员变量)
画法:普通实线箭头(可标注角色和多重性)
class Teacher {std::vector<Student*> students; // 1对多关联
};
4.聚合
语义:弱拥有关系,部分可独立于整体存在
画法:空心菱形箭头(菱形指向整体)
class Department {std::vector<Teacher*> teachers; // 聚合
};
5.组合
语义:强拥有关系,部分与整体生命周期一致
画法:实心菱形箭头
class Car {Engine engine; // 组合
};
6.依赖
语义:临时使用关系(如参数、局部变量)
画法:虚线箭头
class Logger {void log(const std::string& msg); // 依赖string
};
总结
提示:这里对文章进行总结:
上述关系的完整对比表如下:
上述所给的关系在一个UML类型中如下:
上述关系通过C++代码示例如下:
#include <iostream>
#include <vector>
#include <string>// ---------------------- 依赖 Dependency ----------------------
class Logger {
public:void log(const std::string& message) {std::cout << "[LOG] " << message << std::endl;}
};// ---------------------- 关联 Association ----------------------
class Teacher; // 前向声明class Student {
private:std::string name;Teacher* teacher; // 学生关联一个老师(单向关联)
public:Student(const std::string& name) : name(name), teacher(nullptr) {}void setTeacher(Teacher* t) { teacher = t; }void study() {std::cout << name << " is studying." << std::endl;}
};class Teacher {
private:std::string name;std::vector<Student*> students; // 老师关联多个学生(一对多关联)
public:Teacher(const std::string& name) : name(name) {}void addStudent(Student* s) {students.push_back(s);s->setTeacher(this);}void teach() {std::cout << name << " is teaching." << std::endl;}
};// ---------------------- 聚合 Aggregation ----------------------
class Department {
private:std::string name;std::vector<Teacher*> teachers; // 部门聚合多个老师(弱拥有关系)
public:Department(const std::string& name) : name(name) {}void addTeacher(Teacher* t) {teachers.push_back(t);}void showTeachers() {std::cout << "Department " << name << " has teachers:" << std::endl;for (auto t : teachers) {t->teach();}}
};// ---------------------- 组合 Composition ----------------------
class Car {
private:class Engine { // Engine是Car的一部分(组合关系,生命周期绑定)public:void start() {std::cout << "Engine started." << std::endl;}};Engine engine; // Engine对象由Car管理
public:void start() {engine.start();std::cout << "Car is running." << std::endl;}
};// ---------------------- 继承 Inheritance ----------------------
class Animal {
public:virtual void speak() = 0; // 纯虚函数(抽象类)
};class Dog : public Animal { // 继承关系
public:void speak() override {std::cout << "Woof!" << std::endl;}
};// ---------------------- 主函数 ----------------------
int main() {// 依赖关系Logger logger;logger.log("Program started.");// 关联关系Teacher profSmith("Prof. Smith");Student alice("Alice");Student bob("Bob");profSmith.addStudent(&alice);profSmith.addStudent(&bob);profSmith.teach();alice.study();// 聚合关系Department csDept("Computer Science");csDept.addTeacher(&profSmith);csDept.showTeachers();// 组合关系Car myCar;myCar.start();// 继承关系Dog myDog;myDog.speak();return 0;
}
有了类图的了解,对学习设计原则与设计模式事半功倍。