一:UML类图

article/2025/8/4 10:07:01

类之间的关系

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
学习设计模式的第一步是看懂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.hkcw.cn/article/TGJKxQTKYJ.shtml

相关文章

Python数学可视化——环境搭建与基础绘图

Python数学可视化——环境搭建与基础绘图 数学函数可视化入门&#xff08;一次函数/三角函数&#xff09; 本节将建立Python科学计算环境&#xff0c;并创建基础函数绘图工具&#xff0c;可生成一次函数和三角函数的可视化图像&#xff0c;同时结合物理中的匀速直线运动案例。…

mask2former训练自己的语义分割数据集

一、环境配置 1.1下载源码 mask2former: https://github.com/facebookresearch/Mask2Former/tree/maindetectron2: https://github.com/facebookresearch/detectron2下载完后&#xff0c;新建一个文件夹&#xff0c;起个名字&#xff08;我起的Mask2Former-main&#xff09…

如何使用1panel部署linux网站

找到官网&#xff0c;尝试一下在线安装 如果在线不成功&#xff0c;试一下离线安装 按照指令一步步执行即可&#xff0c;注意换成新版本的名称即可 如果成功&#xff0c;你会看到这个页面 1Panel Log]: [1Panel Log]: 感谢您的耐心等待&#xff0c;安装已完成 [1Panel Log]:…

个人用户进行LLMs本地部署前如何自查和筛选

一、个人用户硬件自查清单&#xff08;从核心到次要&#xff09; 1. 显卡&#xff08;GPU&#xff09;——决定性因素 显存容量&#xff08;关键指标&#xff09;&#xff1a; 入门级&#xff08;8~12GB&#xff09;&#xff1a;可运行7B模型&#xff08;4bit量化&#xff09;…

java Map双列集合

单列集合&#xff1a;一次只能添加一个元素 双列集合&#xff1a;一次添加两个元素&#xff0c;左边的叫键&#xff08;唯一的不能重复&#xff09;&#xff0c;右边叫值&#xff08;可以重复&#xff09;&#xff0c;键和值一一对应。这样一对叫&#xff1a;键值对/键值对对象…

在IIS上无法使用PUT等请求

错误来源&#xff1a; chat:1 Access to XMLHttpRequest at http://101.126.139.3:11000/api/receiver/message from origin http://101.126.139.3 has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 其实我的后…

FastVLM: Efficient Vision Encoding for Vision Language Models——为视觉语言模型提供高效的视觉编码

这篇文章的核心内容是介绍了一种名为 FastVLM 的新型视觉语言模型&#xff08;VLM&#xff09;&#xff0c;它通过一种高效的视觉编码器 FastViTHD&#xff0c;在高分辨率图像输入下实现了显著的性能提升和延迟降低。以下是文章的主要研究内容总结&#xff1a; 1. 研究背景与动…

关于开发板连接电脑找不到CH340解决方法大全(附ch340驱动下载链接)

一、一般开发板只需要一根支持传输数据的usb线就可以&#xff0c;找不到就是驱动没安装&#xff0c;一般win11系统会自动后台安装&#xff0c;如果没安装需要手动 ch340驱动官网&#xff1a;南京沁恒微电子股份有限公司 安装还失败就用这个&#xff08;安装之后重启电脑就可以了…

Flask文件处理全攻略:安全上传下载与异常处理实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

机器学习有监督学习sklearn实战二:六种算法对鸢尾花(Iris)数据集进行分类和特征可视化

本项目代码在个人github链接&#xff1a;https://github.com/KLWU07/Machine-learning-Project-practice 六种分类算法分别为逻辑回归LR、线性判别分析LDA、K近邻KNN、决策树CART、朴素贝叶斯NB、支持向量机SVM。 一、项目代码描述 1.数据准备和分析可视化 加载鸢尾花数据集&…

Vim 支持多种编程语言编辑器

软件简介 Vim是Vi编辑器的增强版&#xff0c;它提供了更多的功能和快捷键。Vim是一款自由软件&#xff0c;它是由Bram Moolenaar在1991年创建的。Vim支持多种编程语言&#xff0c;包括C、C、Java、Python、Perl等等。它是一款轻量级的编辑器&#xff0c;可以快速打开和编辑大型…

CppCon 2014 学习:Unicode in C++

在 Unicode 出现之前&#xff0c;计算机使用各种 单字节编码&#xff08;Single-Byte Encodings&#xff09; 来表示文本。理解这些编码对于学习字符集的演变过程很有帮助&#xff0c;以下是关键点的解释&#xff1a; 什么是单字节编码&#xff08;Single-Byte Encoding&#…

【计算机网络】第3章:传输层—面向连接的传输:TCP

目录 一、PPT 二、总结 TCP&#xff08;传输控制协议&#xff09;详解 1. 概述 核心特性&#xff1a; 2. TCP报文段结构 关键字段说明&#xff1a; 3. TCP连接管理 3.1 三次握手&#xff08;建立连接&#xff09; 3.2 四次挥手&#xff08;终止连接&#xff09; 4. 可…

python打卡 DAY 18 推断聚类后簇的类型

目录 聚类结果分析与簇类型推断学习笔记 一、聚类后分析基础流程 1.1 基本分析步骤 1.2 常用可视化工具 二、簇特征分析方法 2.1 数值型特征分析 簇中心对比 雷达图展示 2.2 类别型特征分析 频数统计 卡方检验 三、簇类型推断技术 3.1 基于统计特征的推断 关键指标…

【RocketMQ 生产者和消费者】- 生产者发送同步、异步、单向消息源码分析(2)

文章目录 1. 前言2. InvokeCallback#operationComplete3. onExceptionImpl 异常处理4. 定时任务扫描 responseTable5. 小结 本文章基于 RocketMQ 4.9.3 1. 前言 【RocketMQ】- 源码系列目录【RocketMQ 生产者消费者】- 同步、异步、单向发送消费消息【RocketMQ 生产者和消费者…

【大模型DA】Unified Language-driven Zero-shot Domain Adaptation

Motivation 本文动机在于解决现有方法对 domain-ID 和多模型的依赖问题&#xff0c;提出一个更实用、更通用的新设定 ULDA&#xff0c;使模型仅通过语言描述就能在不访问目标图像的前提下一次性适应多个未知目标域 这篇文章的方法部分提出了一个统一框架来解决Unified Language…

Tomcat 线程模型详解性能调优

1. Tomcat I/O模型详解**&#xff08;了解&#xff09;** 1.1 Linux I/O模型详解 I/O要解决什么问题 I/O&#xff1a;在计算机内存与外部设备之间拷贝数据的过程。 程序通过CPU向外部设备发出读指令&#xff0c;数据从外部设备拷贝至内存需要一段时间&#xff0c;这段时间CPU就…

Mem0: Building Production-Ready AI Agents with Scalable Long-Term Memory

文章目录 摘要Abstract1. 引言2. Mem03. graph-based Mem0参考总结 摘要 Mem0是一种针对AI智能体的长时记忆架构&#xff0c;旨在解决大型语言模型固定上下文窗口导致的跨会话连贯性问题。其基础版本采用两阶段处理范式&#xff1a;提取阶段通过结合对话摘要、近期消息序列和新…

C++构造函数详解:从基础到高级

文章目录 1. 摘要2. 默认构造函数3. 无参构造函数4. 带参构造函数5. 拷贝构造函数6. 移动构造函数 (C11)7. 委托构造函数 (C11)8. 转换构造函数9. 默认拷贝构造函数10. 总结 1. 摘要 构造函数是C类的重要组成部分&#xff0c;负责对象的初始化工作。本文将详细讲解8种构造函数…

day16 leetcode-hot100-32(链表11)

138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 1.哈希表 思路 第一次遍历创建新节点并将原节点与新节点同时放入哈希表中 第二次遍历为新节点加入next与random 具体代码 /* // Definition for a Node. class Node {int val;Node next;Node random;public N…