当前位置: 首页 > news >正文

一: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;
}
	有了类图的了解,对学习设计原则与设计模式事半功倍。
http://www.xdnf.cn/news/759439.html

相关文章:

  • JMeter 直连数据库
  • 1Remote远程会话管理以及一键启动虚拟机
  • Spring 中 @Value 注解多实例配置方案详解
  • 看问题的本质背后是什么?
  • pycharm打印时不换行,方便对比观察
  • Vue3.5 企业级管理系统实战(二十一):菜单权限
  • 前端面经 两栏布局
  • 远程管理SSH服务的搭建
  • 论文略读:Uncertainty-Aware Graph Structure Learning
  • 开源版 PyMOL 如何绘制 新冠病毒 分子结构?
  • Vue单文件组件
  • 打卡day42
  • 【Netty】EventLoopGroup
  • waitpid的waitstatus 含义源码解读
  • Linux 内核中 skb_orphan 的深度解析:从版本差异到核心机制
  • JOIN使用的注意事项
  • HTTP协议解析
  • 话题通信之python实现
  • 【免杀】C2免杀技术(十三)Inline Hook 概念篇
  • C# winform 教程(一)
  • Hartree-Fock 自洽场计算流程
  • Oracle正则表达式学习
  • 正则表达式笔记
  • yolo目标检测助手:具有模型预测、图像标注功能
  • 【复杂网络分析】什么是modularity?
  • maven中的maven-antrun-plugin插件详解
  • Go语言中的rune和byte类型详解
  • MySQL(49)如何使用DEFAULT指定默认值?
  • 配置Ollama环境变量,实现远程访问
  • 怎么样提高研发质量?