C++ UML 类图介绍与设计

1 类图概述

  • UML(Unified Modeling Language),即统一建模语言,是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。
  • UML从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等9种图。
  • 类图显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图是面向对象建模的主要组成部分,简化了人们对系统的理解。类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。

2 类图中类的表示方法

  • 介绍一个绘制类图的在线工具 draw
  • 也可以去draw官网下载安装客户端

2.1 普通类

  • 在UML类图中,类使用包含类名、属性和方法且带有分割线的矩形来表示。

  • 比如有这样一个类

    •  class Student {public:int study(std::string name);private:std::string m_name;int m_code;};
      
  • 可以如下表示
    在这里插入图片描述

  • 访问权限

    • + 表示public
    • - 表示private
    • # 表示protect
  • 属性的完整表示方式

    • 可见性 名称: 类型
  • 方法的完整表示方式

    • 可见性 名称(参数列表): 返回类型

2.2 抽象类

  • 有这样一个抽象类

    •  class Animal {public:virtual void makeSound() = 0;std::string getName() ;private:std::string m_name;};
      
  • 可以如下表示
    在这里插入图片描述

  • 抽象类类名称用斜体表示,抽象方法用斜体表示

  • 类图边框用虚线表示(建议)

3 类与类的关系

3.1 关联关系

  • 关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,比如老师和学生等。关联关系是类与类之间最常用的一种关系,一般引用的对象,会作为另外一个类的成员变量来使用。
  • 关联关系又可以分为单向关联、双向关联和自关联。

3.1.1 单向关联

  • 有以下两个类Address和Person,其中Person有一个属性为Address,这种就称为单向关联关系。
    •   // Address类class Address {public:// 获取街道信息std::string getStreet() { return m_street; }// 获取城市信息std::string getCity() { return m_city; }private:std::string m_street; // 街道信息std::string m_city; //城市信息};// Person类,其中包含一个Address对象的指针class Person {public:// 设置某人地址void setAddress(Address* address) { m_address = address; }// 获取某人姓名std::string getName() { return m_name; };// 获取某人对应地址Address* getAddress() { return m_address; };private:std::string m_name;Address* m_address; // 关联关系,Person类包含一个Address类的指针};
      
  • 在UML类图中单向关联用一个带箭头的实线表示。
    在这里插入图片描述

3.1.2 双向关联

  • 双向关联就是双方各自含有对方类型的成员变量
    •   // 课程类class Course {public:void setTeacher(Teacher* teacher) { m_teacher = teacher;}std::string getName()  { return m_name; }Teacher* getTeacher() { return m_teacher; }private:std::string m_name;Teacher* m_teacher; // 课程属于哪个教师};// 教师类class Teacher {public:// 获取教师姓名std::string getName() const { return m_name; }// 给教师设置课程void setCourse(Course* course) { m_courses = course;  };// 获取该教师教授的所有课程Course* getCourses() { return m_courses; }private:std::string m_name; // 教师姓名Course* m_courses; // 教师对应的课程};
      
  • 在UML类图中,双向关联用一个不带箭头的直线表示
    在这里插入图片描述

3.2 聚合关系

  • 这是一种特殊形式的关联,表示类之间整体与部分的关系,其中部分可以独立存在,即使整体不存在。
  • 下面实现了一个员工类和部门类,部门类中包含了员工类对象。而员工类可以离开部门类而单独存在。
    •   // 员工类class Employee {public:std::string getName() const { return m_name; }int getId() const { return m_id; }private:std::string m_name;int m_id;};// 部门类class Department {public:// 添加员工void addEmployee(Employee emp) {m_employees.push_back(emp);}// 展示员工信息void displayEmployees() {std::vector<Employee>::iterator iter = m_employees.begin();for (; iter != m_employees.end(); iter++) {std::cout << "name : " << iter->getName();std::cout << "id : " << iter->getId();}}private:std::vector<Employee> m_employees; // 部门类包含员工对象的容器,形成聚合关系};
      
  • UML类图中,组合关系用带空心菱形的实线表示,菱形指向整体。
    在这里插入图片描述
  • 聚合关系可以是一对一,也可以是一对多。比如Department中可以包含多个Employee数组,也可以只包含一个Employee对象。

3.3 组合关系

  • 组合表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。在组合关系中,整体对象可以控制部分对象的声明周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。
  • 实现一个引擎类和汽车类,引擎属于汽车的一部分,且引擎不能脱离汽车而单独存在。
    •   // 引擎类,是汽车类的一部分class Engine {public:int getHorsePower() { return m_horsePower; }private:int m_horsePower;};// 汽车类class Car {public:int getCarId() { return m_carId; }int getEngineHorsePower() { return m_engine->getHorsePower(); }private:int m_carId;Engine* m_engine; // Car类组合了一个Engine对象};
      
  • UML类图中,组合关系用带实心菱形的实线表示,菱形指向整体。
    在这里插入图片描述

3.4 依赖关系

  • 依赖关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。
  • 依赖关系指的是一个类依赖于另一个类的功能或服务,但并不直接拥有或包含另一个类的实例。依赖关系通常体现在一个类的方法中通过参数传递、全局函数或静态方法等方式使用另一个类。
  • 比如有一个People类和Circle类,People类中并不包含Circle,但是可以调用Circle类对象的draw方法来画一个圆。
    •   // 圆class Circle {public:// 画圆void draw() { }private:int m_radius;};// 有一个人class People {public:// 调用圆类的画圆方法void drawCircle(Circle circle) { circle.draw(); }private:string m_name;};
      
  • 在UML类图中,依赖关系用带箭头的虚线表示,箭头从使用类指向被依赖的类。
    在这里插入图片描述

3.5 继承(泛化)关系

  • 继承(泛化)关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系。
  • 比如学生类和教师类都继承于基本类People,有基本方法sleep和eat以及各自独有的方法study和work
    •   class People {public:void sleep() {  }void eat() { }private:int m_name;};class Studet : public People {public:void study() {}private:int m_studentId;};class Teacher : public People {public:void work() {}private:int m_jobNumber;};
      
  • UML类图中,继承关系用带空心三角箭头的实线表示,箭头从子类指向父类。
    在这里插入图片描述

3.6 实现关系

  • 实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。
    •   // 抽象接口类,相当于UML中的Interfaceclass Printable {public:virtual void print()  = 0;};// 具体实现类,实现了Printable接口class Document : public Printable {public:// 实现接口中的print()函数void print() {std::cout << "Content of the document: " << m_content << std::endl;}private:std::string m_content;};
      
  • 在UML类图中,实现关系使用带空心三角箭头的虚线表示
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/618682.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 通过权重做随机

我们可以通过Random.Range方法结合权重来实现随机选择。具体步骤如下&#xff1a; 首先&#xff0c;创建一个数组&#xff0c;其中包含你要选择的项目&#xff0c;并为每个项目分配一个权重值。 计算所有权重值的总和。 使用Random.Range生成一个介于0和总权重之间的随机数。…

消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测

Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 消除 BEV 空间中的跨模态冲突&#xff0c;实现 LiDAR 相机 3D 目标检测 摘要Introduction本文方法Single-Modal BEV Feature ExtractionSemantic-guided Flow-based AlignmentDissolved…

2024妈妈杯数学建模A 题思路分析-移动通信网络中 PCI 规划问题

# 1 赛题 A 题 移动通信网络中 PCI 规划问题 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖 小区编号进行合理配置&#xff0c;以避免 PCI 冲突、 PCI 混淆以及 PCI 模 3 干扰等 现象。 PCI 规划对于减少物理层的小区间互相干扰(ICI)&#xff0c;增…

jvisualVM分析jvm内存使用快照dump

服务发生内存溢出&#xff0c;就需要查看服务器上Java服务的jvm堆内存使用情况&#xff0c;可以使用dump命令生成dump文件&#xff0c;然后下载到本地&#xff0c;然后使用jvisualVM工具打开&#xff0c;即可实现可视化分析。 生成dump文件常用的两种方式&#xff1a; 第一种…

软件测试基础知识点汇总

1、衡量一个优秀软件的维度 质量模型&#xff1a;功能性、性能、兼容性、易用性、可靠性、安全、可维护性、可移植性。 2、软件测试流程 需求评审、计划编写、用例设计、用例执行、缺陷管理、测试报告 3、用例设计编写格式 用例编号、用例标题、项目/模块、优先级、前置条…

赋能未来:AI技术革新中的创业契机

目录 前言 一、行业解决方案 1、行业参考说明 2、操作步骤建议 二、智能产品和服务 1、行业参考说明 2、操作步骤建议 三、教育和培训 1、行业参考说明 2、操作步骤建议 总结 前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;越来越多的创业…

【前端面试3+1】16 TCP与UDP的区别、如何清除浮动、哪些原因造成阻塞页面渲染、【相同的树】

一、TCP与UDP的区别 TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种常用的网络传输协议&#xff0c;它们有以下几点区别&#xff1a; 1、连接性&#xff1a; TCP是面向连接的协议&#xff0c;通信双方在…

区间相关

判断两区间是否有交集&#xff1f; 线段元素有序&#xff08;比如按照x1排序:a ,b&#xff09;&#xff1a; a x 2 > b x 1 ax2 > bx1 ax2>bx1 无序&#xff1a; m i n ( a x 2 , b x 2 ) > m a x ( a x 1 , b x 1 ) min(ax2, bx2) > max(ax1, bx1) min(ax2,…

excel里如何的科学计数法的数字转换成数值?

比如下图&#xff0c;要想把它们转换成3250跟1780&#xff0c;有什么快捷的办法吗&#xff1f; 科学计数法在excel里的格式&#xff0c;与我们常规在数学上写的有差异。这个转换可以这样做&#xff1a; 1.转换后的效果&#xff1a; 2.问题分析 题目中所附截图&#xff0c;单元…

Python学习笔记24 - 学生信息管理系统

1. 需求分析 2. 系统设计 3. 系统开发必备 4. 主函数设计 5. 学生信息维护模块设计 a. 录入学生信息 b. 删除学生信息 c. 修改学生信息 d. 查询学生信息 e. 统计学生总人数 f. 显示所有学生信息 g. 排序模块设计 6. 项目打包

【Leetcode】1702. 修改后的最大二进制字符串

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个二进制字符串 b i n a r y binary binary &#xff0c;它仅有 0 0 0 或者 1 1 1 组成。你可以使用下面的操作任意次对它进行修改&#xff1a; 操作 1 &#xff1a;如果…

解决vue3更新chunk包后,点击页面报错

出现错误 解决思路 试了好多方法&#xff0c;跳了很多坑&#xff0c;router版本对不上&#xff0c;解决方案不实用。最后我直接捕获异常&#xff0c;刷新页面&#xff0c;解决最快最有效。 // vue-rotuer版本 "vue-router": "^4.0.3"解决方案 在router/…