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.mzph.cn/news/816106.shtml

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

相关文章

深拷贝总结

JSON.parse(JSON.stringify(obj)) 这行代码的运行过程&#xff0c;就是利用 JSON.stringify 将js对象序列化&#xff08;JSON字符串&#xff09;&#xff0c;再使用JSON.parse来反序列化&#xff08;还原&#xff09;js对象&#xff1b;序列化的作用是存储和传输。&#xff08…

亚马逊云科技官方重磅发布GenAI应用开发学习路线(全免费)

今天小李哥给大家分享的是亚马逊云科技&#xff08;AWS&#xff09;最近官方发布的GenAI应用开发最佳学习路线&#xff0c;不仅内容非常全面更主要的是全部免费&#xff01;大家动动小手就能成为GenAI开发大&#x1f42e;&#xff01; 1️⃣这个GenAI开发学习路线包括什么&…

遥感卫星:探索地球的科技之旅

遥感卫星是人类探索地球、理解地球、保护地球的重要工具&#xff0c;其发展历程承载了人类对地球的探索与认知的历程。从最初的概念到如今的高科技应用&#xff0c;遥感卫星技术的发展见证了人类科技的不断进步与创新。 初心萌芽&#xff1a; 遥感卫星的发展始于20世纪中叶&…

C语言高质量编程之assert()和const

目录 编程中常见的错误 assert() const 编程中常见的错误 在编程中我们通常会遇到三种错误形式&#xff0c;分别是&#xff1a;编译型错误&#xff0c;链接型错误&#xff0c;运行时错误。 编译型错误&#xff1a; 在编译阶段发生的错误&#xff0c;绝大多数情况是由语法错误…

利用Sentinel解决雪崩问题(二)隔离和降级

前言&#xff1a; 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩&#xff0c;就要靠线程隔离(舱壁模式)和熔断降级手段了&#xff0c;不管是线程隔离还是熔断降级&#xff0c;都是对客户端(调…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先&#xff0c;官方不推荐v-if和v-for在同一个元素上使用。其次&#xff0c;如果两者同时使用&#xff0c;v-if和v-for的优先级怎么确定&#xff1f;在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先&#xff0c;条件不存在时也会渲染多个注释节点。在vue3中进行了改…

基于51单片机的无线病床呼叫系统设计—LCD1602显示

基于51单片机的无线病床呼叫系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.病人按下按键&#xff0c;LCD1602显示对应的床位号&#xff1b; 2.多人同时呼叫&#xff0c;显示屏同时显示&#xf…

文献阅读:Viv:在 web 上多尺度可视化高分辨率多重生物成像数据

文献介绍 「文献题目」 Viv: multiscale visualization of high-resolution multiplexed bioimaging data on the web 「研究团队」 Nils Gehlenborg&#xff08;美国哈佛医学院&#xff09; 「发表时间」 2022-05-11 「发表期刊」 Nature Methods 「影响因子」 47.9 「DOI…

第17天:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

第十七天 本课意义 1.CMS识别到后期漏洞利用和代码审计 2.开发框架识别到后期漏洞利用和代码审计 3.开发组件识别到后期漏洞利用和代码审计 一、CMS指纹识别-不出网程序识别 1.概念 CMS指纹识别一般能识别到的都是以PHP语言开发的网页为主&#xff0c;其他语言开发的网页识…

Unix环境高级编程-学习-09-多线程之读写锁与条件变量(包含线程池的部分实现与测试验证)

目录 一、多线程相关文章链接 二、自由抒发 1、读写锁 2、条件变量 三、函数介绍 1、pthread_rwlock_init &#xff08;1&#xff09;声明 &#xff08;2&#xff09;作用 &#xff08;3&#xff09;参数 &#xff08;4&#xff09;返回值 &#xff08;5&#xff09;…

深度学习学习日记4.14 数据增强 Unet网络部分

数据增强 transforms.Compose([&#xff1a;这表示创建一个转换组合&#xff0c;将多个数据转换操作串联在一起 transforms.RandomHorizontalFlip()&#xff1a;这个操作是随机水平翻转图像&#xff0c;以增加数据的多样性。它以一定的概率随机地水平翻转输入的图像。 transfo…

29、链表-删除链表的倒数第N个结点

思路: 首先找到倒数第N个结点 第一种方式 先统计链表的节点数&#xff0c;然后再次遍历len-N即可得到倒数第N个结点&#xff0c;然后将前一个节点的next指针指向next的下一个节点使用快慢指针&#xff0c;快指针先跑N个结点然后慢指针开始跑&#xff0c;等快指针到达尾节点后…

多因子模型的因子选取

经典的Alpha模型是一些多因子模型&#xff0c;用于预测Alpha模型的信息比率&#xff0c;从而来判断判断模型的好坏。这里我们所说的信息比率是相对收益率除以非系统性风险&#xff0c;所以当我们在进行因子选择的时候&#xff0c;我们一定不能选取系统性风险模型&#xff08;例…

免费VPS云服务器汇总,最长永久免费使用

目前云服务器市场竞争很激烈&#xff0c;为了方便吸引上云&#xff0c;很多云计算服务商提供免费试用云服务器&#xff0c;下面给大家整理汇总一下免费VPS云服务器&#xff0c;最长永久免费使用&#xff01; 一、雨云&#xff08;优惠码:ABC&#xff09; 活动地址&#xff1a;…

2D AI交互数字人:赋能文旅、金融、政务、教育行业数字化转型

AI交互数字人结合了语音合成、语音识别、语义理解、图像处理、机器翻译、虚拟形象驱动等多项AI核心技术&#xff0c;可以提供服务导览、业务咨询、语音互动交流、信息播报等智能服务。 其中&#xff0c;2D AI交互数字人是采集真人视频&#xff0c;通过AI训练&#xff0c;生成逼…

认识OpenEuler操作系统

引言 在信息技术日新月异的时代&#xff0c;开源软件已成驱动创新的核心动能&#xff0c;其中&#xff0c;OpenEuler作为一款冉冉升起的开源操作系统典范&#xff0c;凭借其对开源精神的坚守与技术创新的不懈追求&#xff0c;自亮相以来便引发了全球关注。本文将全方位深挖Open…

Xcode 15.0 新 #Preview 预览让 SwiftUI 界面调试更加悠然自得

概览 从 Xcode 15 开始&#xff0c;苹果推出了新的 #Preview 宏预览机制&#xff0c;它无论从语法还是灵活性上都远远超过之前的预览方式。#Preview 不但可以实时预览 SwiftUI 视图&#xff0c;而且对 UIKit 的界面预览也是信手拈来。 想学习新 #Preview 预览的一些超实用调试…

使用新一代一站式 AI Bot 开发平台扣子coze,搭建我的第一个AI Bot(前端魔法师) ,

目录 1.概述​ 2.功能与优势 3.使用扣子 4.人设与回复逻辑 5.添加插件 6.预览与调试 7.发布bot Store 8.环境大家体验&#xff08;给大家内置了比较屌的插件&#xff09; 9.推荐阅读&#xff1a; 1.概述​ 扣子是新一代一站式 AI Bot 开发平台。无论你是否有编程基础…

iOS------SDWebImage源码

一&#xff0c;简介 一个异步图片下载及缓存的库 特性&#xff1a; 一个扩展UIImageView分类的库&#xff0c;支持加载网络图片并缓存图片异步图片下载器异步图片缓存和自动图片有效期限管理支持GIF动态图片支持WebP背景图片减压保证同一个URL不会再次下载保证无效的URL不会…

Web前端 Javascript笔记3

1、垃圾回收机制 内存中的生命周期 1、内存分配 2、内存使用&#xff08;读写&#xff09; 3、内存回收&#xff0c;使用完毕之后&#xff0c;垃圾回收器完成 内存泄漏&#xff1a;该回收的&#xff0c;由于某些未知因素&#xff0c;未释放&#xff0c;叫做内存泄漏 栈&#xf…