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中的Interface
        class 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.mfbz.cn/a/553293.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL的学习心得和知识总结(一百三十八)|深入理解PostgreSQL数据库之Protocol message构造和解析逻辑

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

牛客 NC205 跳跃游戏(三)【中等 贪心 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/14abdfaf0ec4419cbc722decc709938b 思路 参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** …

带缓存的输入输出流(I/O)

文章目录 前言一、带缓冲的输入输出流是什么&#xff1f;二、使用方法 1.BufferedInputStream与BufferedOutputStream类2.BufferedReader与BufferedWriter类总结 前言 输入输出流可以视为&#xff0c;从A点把货物搬运至B点。那么带缓冲的意思可以视为用货车把A点的货物搬运至B点…

代码随想录算法训练营DAY28(记录)|C++回溯算法Part.5|491.递增子序列、46.全排列、47.全排列II

文章目录 491.递增子序列思路伪代码CPP代码优化代码 46.全排列思路伪代码CPP代码 47.全排列IICPP代码 491.递增子序列 力扣题目链接 文章链接&#xff1a;491.递增子序列 视频连接&#xff1a;回溯算法精讲&#xff0c;树层去重与树枝去重 | LeetCode&#xff1a;491.递增子序列…

安装GPT 学术优化 (GPT Academic)@FreeBSD

GPT 学术优化 (GPT Academic)是一个非常棒的项目 可以帮助我们完成中科院的一些日常工作。 官网&#xff1a;GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口&#xff0c;特别优化论文阅读/润色/写作体验&#xff0c;模块化设计&#xff0c;…

win2022服务器apache配置https(ssl)真实环境实验(避坑之作)不依赖宝塔小皮等集成环境

本次实验背景&#xff1a; 完全参考官方 https://cloud.tencent.com/document/product/400/4143 文档流程&#xff0c;没有搞定&#xff0c;于是写下避坑之作。 服务器&#xff1a;腾讯云轻量应用服务器 操作系统&#xff1a; Windows Server 2022 DataCenter 64bit CN apache…

51-41 Stable Video Diffusion,高质量视频生成新时代

23年11月&#xff0c;Stability AI公司公开了稳定视频扩散模型Stable Video Diffusion(SVD)的代码和权重&#xff0c;视频生成迎来了新时代。SVD是一种潜在扩散模型&#xff0c;支持文本生成视频、图像生成视频以及物体多视角3D合成。从工程角度来看&#xff0c;本文主要提出了…

C++如何使用string类

文章目录 为什么要学习string?库中的string关于编码ASCII编码Unicode编码 迭代器Iteratorsstring常用构造接口接口声明与功能说明接口演示 string类对象的容量操作接口声明与功能说明接口演示reverse与resize在不同平台下的扩容与缩容机制 string类对象的访问及遍历操作接口声…

Java项目实现图形验证码(Hutool)

项目架构&#xff1a; 使用SpringCloudmysqlmybatis-plus需要将数据库中的数据导出到Excel文件中 前端为Vue2 业务场景&#xff1a; 登录时使用验证码登录 1.1 打开hutool, 搜索 图片验证码 1.2后端编写生产验证码方法 1.3前端 1.3.1展示验证码 1.3.2 前端方法 1.3.2.1UU…

Django中的数据库优化与ORM性能调优【第169篇—ORM性能调优】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django中的数据库优化与ORM性能调优 在开发基于Django的Web应用程序时&#xff0c;数据库是…

ubuntu 查询mysql的用户名和密码 ubuntu查看username

ubuntu 查询mysql的用户名和密码 ubuntu查看username 文章标签mysqlUbuntu用户名文章分类MySQL数据库 一.基本命令 1.查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.5 LTS Release: 16.04 Coden…

leetcode-分割链表

题目 面试题 02.04. 分割链表 提示 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff…

linux-centos虚拟机设置固定ip

环境准备 虚拟机版本&#xff1a;centos7 安装环境&#xff1a;vmware17 1、设置网络连接 虚拟机-设置-网络适配器-NAT模式 2、查看子网信息 编辑-虚拟网络编辑器-NAT模式-NAT设置 查看子网ip和网关ip 下一步要用 3、修改配置文件 vim /etc/sysconfig/network-scripts…

BGP边界网关路由实验(华为)

一&#xff0c;技术简介 BGP&#xff08;边界网关路由协议&#xff09;是一种自治系统&#xff08;AS&#xff09;间的协议&#xff0c;主要用于在不同的AS之间交换路由信息。AS是一个由一组网络设备和路由器组成的网络集合&#xff0c;这些设备可以在一个共同的管理域中协同工…

Netty-NioServerSocketChannel与NioSocketChannel

NioServerSocketChannel NioServerSocketChannel是netty服务端的channel。在ServerbootStrap的bind方法中&#xff0c;通过反射&#xff0c;实例化对象NioServerSocketChannel。   NioServerSocketChannel对象实例化的过程中。 AbstractChannel中实例化channel的id&#xff…

【QT进阶】Qt Web混合编程之QWebEngineView基本用法

往期回顾 【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左&#xff0c;文本水平的效果-CSDN博客【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍-CSDN博客 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用-CSDN博客 【QT进阶】Qt Web混合编程之QWebEngi…

通过Idea部署Tomcat服务器

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

EFK环境搭建(基于K8S环境部署)

目录 一.环境信息二.安装nfs供应商三.安装elasticsearch四.安装kibana组件五.安装fluentd 一.环境信息 1.服务器及k8s版本 IP地址主机名称角色版本192.168.40.180master1master节点1.27192.168.40.181node1node1节点1.27192.168.40.182node2node2节点1.27 2.部署组件版本 序…

Python 数据结构和算法实用指南(二)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第四章&#xff1a;列表和指针结构 我们已经在 Python 中讨论了列表&#xff0c;它们方便而强大。通常情况下&#xff0c;我们使用 Python…

近端安全互联样例使用指导

样例介绍 本样例基于rk3568开发板&#xff0c;通过封装openharmony安全子系统deviceauth组件提供的能力&#xff0c;实现了一组可用于设备间快速建立可信认证和连接的接口&#xff0c;通过预先定义关系网&#xff0c;在设备初始化阶段完成端端设备间的认证&#xff0c;构建安全…