以C++为例详解UML

以C++为例详解UML

—— 2024-04-14

文章目录

  • 以C++为例详解UML
    • 1. 什么是UML?
    • 2. UML模型结构
    • 3. UML中类的表示
    • 4. UML中类之间的关系
      • 4.1 泛化
      • 4.2 实现
      • 4.3 关联
        • (1) 单向关联
        • (2) 双向关联
        • (3) 自关联
        • (4) 多重关联
      • 4.4 聚合
      • 4.5 组合
      • 4.6 依赖
    • 5. 关联、组合、聚合与依赖的区别
    • 6. 补充笔记,术语说明
      • 表格说明
      • 术语之间的区别
      • 术语解释与英文全称
      • C++ 示例与表格说明

1. 什么是UML?

UML即统一建模语言,它是用于开发、说明、可视化与构建一个面向对象软件的一种方法。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。UML类图将用户所希望描述的事物抽象为类,描述类的内部与多个类之间的设计视图。为之后学习各种设计模式打下基础,因为我们可以通过一种直观的表示方法来描述设计模式。

2. UML模型结构

UML是一种主要由图形符号表示的建模语言,其结构主要包括:

  • 视图:从不同角度来表示待建模的系统,视图是由很多图形组成的一个抽象集合;一个系统模型可能有多个视图,每个视图从特定角度来描述系统的特征,比如用户视图、结构视图、行为视图、实现视图等。
  • :图是UML视图内容的图形,比如用例图、类图、对象图、包图等。
  • 模型元素:UML图中使用的一些概念,如类、对象、消息以及各种关系等。
  • 通用机制:UML提供的通用机制为模型元素提供额外的注释、语义和扩展机制,允许用户对UML进行扩展。

3. UML中类的表示

类是由一个矩形框表示的,矩形框分为三层。如下图所示:

在这里插入图片描述

  • 第一层:类的名称,如果该类是抽象类,则使用斜体;
  • 第二层:类的属性,即成员变量。格式为:[外部可见性]名称:类型[=默认值];
  • 第三层:类的方法,即成员函数。格式为:[外部可见性]名称([参数列表])[:返回值类型];

外部可见性说明:

  • -:private(私有)
  • +:public(公有)
  • #:protect(保护)

在这里插入图片描述

4. UML中类之间的关系

4.1 泛化

含义:类的继承关系

表示:用空心三角形和实线构成,空心三角形指向父类;

举例:狗和猫都属于动物类。

在这里插入图片描述

class Animal {
public:
    void breathe() {
        cout << "I can breathe" << endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        cout << "Woof!" << endl;
    }
};

class Cat : public Animal {
public:
    void meow() {
        cout << "Meow!" << endl;
    }
};

4.2 实现

含义:类与接口的关系,表示类是接口所有特征和行为的实现。

表示:用空心三角形和虚线表示,空心三角形指向接口。

举例:狗和猫实现了动物的吃和跑的接口。

在这里插入图片描述

class AnimalActions {
public:
    virtual void eat() = 0;
    virtual void run() = 0;
};

class Dog : public AnimalActions {
public:
    void eat() override {
        cout << "Dog eats" << endl;
    }
    void run() override {
        cout << "Dog runs" << endl;
    }
};

class Cat : public AnimalActions {
public:
    void eat() override {
        cout << "Cat eats" << endl;
    }
    void run() override {
        cout << "Cat runs" << endl;
    }
};

4.3 关联

关联是一种拥有(has a)关系,一个类可以调用另一个类的公有属性和方法。在类中以成员变量的方式表示。

(1) 单向关联

含义:只有一个类知道另一个类的公有属性和方法。

表示:带箭头的直线表示。

举例:员工都有自己的地址。

在这里插入图片描述

class Address {
public:
    string street;
    string city;
};

class Employee {
public:
    Address* address;
};
(2) 双向关联

含义:双方都知道对方的存在,都可以调用对方的公有属性和方法。

表示:用一条直线连接两个类,也可以用双箭头。

举例:老板有自己的员工,员工也有领导自己的老板。

在这里插入图片描述

class Employee; // Forward declaration to resolve circular dependency.

class Boss {
public:
    vector<Employee*> employees;
};

class Employee {
public:
    Boss* boss;
};
(3) 自关联

含义:自己引用自己

表示:带箭头的直线,指向自己。

举例:二叉树结构体。

在这里插入图片描述

class TreeNode {
public:
    int value;
    TreeNode* leftChild;
    TreeNode* rightChild;
};
(4) 多重关联

含义:对象之间存在多种多重性关联关系。

在这里插入图片描述

class Student;
class Course;

class Enrollment {
public:
    Student* student;
    Course* course;
    string grade;
};

class Student {
public:
    vector<Enrollment*> enrollments;
};

class Course {
public:
    vector<Enrollment*> enrollments;
};

4.4 聚合

含义:整体与部分的关系,部分离开整体后可以单独存在。常用于类的成员变量。

表示:带空心的菱形和直线(或者带箭头的直线),箭头指向部分。

举例:汽车和轮胎,轮胎是汽车的一部分,但轮胎也可以单独存在。

在这里插入图片描述

class Tire {};

class Car {
public:
    Tire* tires[4];
};

4.5 组合

含义:整体和部分的关系,部分离开整体后不可以单独存在,代表整体的对象负责代表部分的对象的生命周期。常用于类的成员变量。

表示:带实心的菱形和直线(带箭头的直线),箭头指向部分。

举例:公司和部分,部门是公司的一部分,但部门不可以单独存在。

在这里插入图片描述

class Department {};

class Company {
public:
    vector<Department> departments;
};

4.6 依赖

含义:是一种使用的关系,即一个类的实现需要另一个类的协助。常用于类方法的局部变量、方法参数等。

表示:带箭头的虚线,箭头指向协助的类。

举例:动物依赖水。

在这里插入图片描述

class Water {};

class Animal {
public:
    void drink(Water& water) {
        cout << "Drinking water" << endl;
    }
};

5. 关联、组合、聚合与依赖的区别

  • 关联 代表类与类的关系;
  • 聚合组合 代表整体与部分的关系;
  • 依赖 是一种弱的关系,表示一个类的方法的实现需要用到另一个类,但二者之间并没有明显的关系。

6. 补充笔记,术语说明

这些术语是面向对象编程(OOP)中常用的概念,用以描述类(对象)之间的关系。它们在软件设计中非常重要,有助于确定如何设计类的结构、对象之间的交互以及系统的整体架构。下面我将详细解释每个术语、它们之间的区别,并用C++示例和表格来说明。

表格说明

术语英文描述C++ 示例
依赖Dependency一个类的实现需要另一个类Report 使用 Teacher
关联Association两个类互相知道对方,可以是单向或双向的StudentTeacher
聚合Aggregation特殊的关联,代表“整体-部分”关系,部分可以独立存在DepartmentTeacher
组合Composition特殊的聚合,整体的生命周期控制部分的生命周期,部分不可独立存在ClassroomStudent
委托Delegation一个类的功能由另一个类实现,是一种典型的设计模式,用于复用和功能分配GraphicsRenderer

术语之间的区别

  • 依赖与关联:依赖通常表示一个类在方法中使用了另一个类的对象,关系较为短暂;关联则表示两个类之间有更稳定的连接,通常通过成员变量实现。
  • 聚合与组合:聚合表示部分可以离开整体而单独存在,例如教师可以属于多个部门;组合则是更强的关系,部分的生命周期依赖于整体,例如班级和学生,班级销毁时学生也应被销毁。
  • 委托:是一种设计模式,一个对象将某个任务委托给另一个对象来执行,以达到代码复用或责任分配的效果。

术语解释与英文全称

  1. 依赖(Dependency)

    • 英文:Dependency
    • 描述:一个类依赖于另一个类,如果一个类的方法操纵另一个类的对象。
  2. 关联(Association)

    • 英文:Association
    • 描述:两个类互相知道对方,可以是单向或双向的。关联关系的存在意味着一个类的对象可以知道另一个类的一个或多个对象。
  3. 聚合(Aggregation)

    • 英文:Aggregation
    • 描述:一种特殊的关联,代表“整体-部分”的关系,但部分可以脱离整体单独存在。
  4. 组合(Composition)

    • 英文:Composition
    • 描述:一种更强的聚合关系,整体的生命周期控制部分的生命周期,部分一旦形成就不可与整体分离。
  5. 委托(Delegation)

    • 英文:Delegation
    • 描述:一个对象外部暴露的责任被内部的另一个对象实现。这是一种设计模式,常用于实现复用和功能分配。

C++ 示例与表格说明

下面通过一个简单的学校模型来说明这些关系:

// 依赖关系示例
class Report {
public:
    void generateReport(Teacher* teacher) {
        // 使用Teacher对象生成报告
    }
};

// 关联关系示例
class Student {
public:
    void setAdvisor(Teacher* advisor) {
        this->advisor = advisor;
    }
private:
    Teacher* advisor;  // 学生知道他们的导师,单向关联
};

// 聚合关系示例
class Department {
public:
    void addTeacher(Teacher* teacher) {
        teachers.push_back(teacher);
    }
private:
    std::vector<Teacher*> teachers;  // 部门包括多个教师,但教师可以属于多个部门
};

// 组合关系示例
class Classroom {
public:
    ~Classroom() {
        for (auto s : students) {
            delete s;
        }
    }
    void addStudent(Student* student) {
        students.push_back(student);
    }
private:
    std::vector<Student*> students;  // 班级控制学生的生命周期
};

// 委托关系示例
class Graphics {
public:
    void draw() {
        renderer->render();
    }
private:
    Renderer* renderer;  // Graphics委托Renderer来进行绘制
};

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

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

相关文章

华为机考入门python3--(15)牛客15-求int型正整数在内存中存储时1的个数

分类&#xff1a;二进制 知识点&#xff1a; int转二进制 binary bin(n)[2:] 题目来自【牛客】 def count_ones_in_binary(n): # 将输入的整数转换为二进制字符串 # bin(n)为0b11011binary bin(n)[2:]# 初始化计数器为0 count 0 # 遍历二进制字符串的每一位 fo…

消息队列RabbitMQ入门学习

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.收发消息 2.1.1.交换机 2.1.2.队列 2.1.3.绑定关系 2.1.4.发送消息 3.SpringAMQP 3.1WorkQueues模型 3.1.1消息接收 3.1.2测试 3.1.3.能者多劳 3.1.3.总结 3.2.交换机类型 3.3.Fanout交…

Golang | Leetcode Golang题解之第28题找出字符串中第一个匹配项的下标

题目&#xff1a; 题解&#xff1a; func strStr(haystack, needle string) int {n, m : len(haystack), len(needle)if m 0 {return 0}pi : make([]int, m)for i, j : 1, 0; i < m; i {for j > 0 && needle[i] ! needle[j] {j pi[j-1]}if needle[i] needle[…

【微信小程序——案例——本地生活(列表页面)】

案例——本地生活&#xff08;列表页面&#xff09; 九宫格中实现导航跳转——以汽车服务为案例&#xff08;之后可以全部实现页面跳转——现在先实现一个&#xff09; 在app.json中添加新页面 修改之前的九宫格view改为navitage 效果图&#xff1a; 动态设置标题内容—…

【Java】内存可见性问题是什么?

文章目录 内存模型内存可见性解决方案volatile 内存模型 什么是JAVA 内存模型&#xff1f; Java Memory Model (JAVA 内存模型&#xff09;是描述线程之间如何通过内存(memory)来进行交互。 具体说来&#xff0c; JVM中存在一个主存区&#xff08;Main Memory或Java Heap Mem…

wpf下RTSP|RTMP播放器两种渲染模式实现

技术背景 在这篇blog之前&#xff0c;我提到了wpf下播放RTMP和RTSP渲染的两种方式&#xff0c;一种是通过控件模式&#xff0c;另外一种是直接原生RTSP、RTMP播放模块&#xff0c;回调rgb&#xff0c;然后在wpf下渲染&#xff0c;本文就两种方式做个说明。 技术实现 以大牛直…

信息系统项目管理师0051:管理基础(4信息系统管理—4.1管理方法—4.1.1管理基础)

点击查看专栏目录 文章目录 第四章 信息系统管理4.1管理方法4.1.1管理基础1.层次结构2.系统管理第四章 信息系统管理 在信息技术和数据资源要素的推动下,社会各领域已经并正在加速进入数字化的全新发展时期,基于智能、网络和大数据的新经济业态正在形成,从“数字融合”向“数…

OpenCV4.9图像金字塔

目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 pyrUp()和 pyrDown()对给定图像进行下采样或上采样。 理论 注意 下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。 通常&#xff0c;我们需要将图像转换为与原始图像不同的大小。为此…

CleanMyMac一键释放Mac潜力的智能助手

在数字化时代&#xff0c;我们的Mac电脑承载着日益增多的数据和文件&#xff0c;使得系统性能逐渐下降&#xff0c;运行缓慢。为了解决这个问题&#xff0c;我们需要一款能够深度清理、优化Mac性能的软件。CleanMyMac&#xff0c;作为Mac系统清理领域的佼佼者&#xff0c;凭借其…

Go语言入门|包、关键字和标识符

目录 Go语言 包文件 规则 关键字 规则 标识符 规则 预定义标识符 Go语言 Go语言是一种静态类型、编译型和并发型的编程语言&#xff0c;由Google开发。Go的源代码文件以.go为扩展名&#xff0c;文件名通常与包名保持一致。一个Go文件可以包含多个顶级声明&#xff0c;…

【opencv】示例-train_HOG.cpp 训练和测试基于支持向量机(SVM)的行人检测器

#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件 #include "opencv2/highgui.hpp" // 包含OpenCV高层GUI&#xff08;图形用户界面&#xff09;头文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块头文件 #includ…

jupyter切换不同的内核(虚拟环境)(anaconda 24.1.2)

jupyter切换不同的内核&#xff08;anaconda 24.1.2&#xff09; 主要的两条命令&#xff1a; conda install ipykernel python -m ipykernel install --user --name 环境名称 anaconda的版本号 conda --version实例&#xff1a; 一、首先可以看到已经创…

【JDBC入门学习】

JDBC简介 注意&#xff1a;1.注册驱动可以不写了 2.导入jar包时要注意点击右键添加 package com.wudreamer.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;/* * jdbc 入门 * */ public class JdbcDemo {public static v…

软考中级工程师网络技术第二节网络体系结构

OSPF将路由器连接的物理网络划分为以下4种类型&#xff0c;以太网属于&#xff08;25&#xff09;&#xff0c;X.25分组交换网属于&#xff08;非广播多址网络NBMA&#xff09;。 A 点对点网络 B 广播多址网络 C 点到多点网络 D 非广播多址网络 试题答案 正确答案&#xff1a; …

SDUT lab5-2

7-2 sdut-JAVA-Credit Card Number Validation 分数 10 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 Each type of credit card begins with a prefix or range of prefixes and is of a certain length. Table 1 shows the details of two commonly used credit ca…

LeetCode-31-下一个排列问题

题目说明 实现获取下一个排列的函数&#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列&#xff0c;则将数字重新排列成最小的排列&#xff08;即升序排列&#xff09;。 必须原地修改&#xff0c;只允许使用额外常数空间。…

论文笔记:SmartPlay : A Benchmark for LLMs as Intelligent Agents

iclr 2024 reviewer评分 5688 引入了 SmartPlay&#xff0c;一种从 6 种不同游戏中提取的基准 衡量LLM作为智能体的能力 1 智能代理所需的能力 论文借鉴游戏设计的概念&#xff0c;确定了智能LLM代理的九项关键能力&#xff0c;并为每项能力确定了多个等级&#xff1a; 长文…

JVM虚拟机(五)强引用、软引用、弱引用、虚引用

目录 一、强引用二、软引用三、弱引用四、虚引用五、总结 引文&#xff1a; 在 Java 中一共存在 4 种引用&#xff1a;强、软、弱、虚。它们主要指的是&#xff0c;在进行垃圾回收的时候&#xff0c;对于不同的引用垃圾回收的情况是不一样的。下面我们就一起来看一下这 4 种引用…

白话微机:10.民风淳朴的MCS-51小镇(小镇方言:汇编)

1. 基本结构与周期 MCS-51系列单片机属于8位单片机用 8051单片机构成最小应用系统时&#xff0c;只要将单片机接上时钟电路和复位电路即可MCS-51单片机由CPU、存储器和I/O三部分组成CPU是指&#xff1a;运算器和控制器 “PC CPU 3BUS RAM I/O” 在执行指令过程中&#xff…

Java-Scanner类进阶+题目

Scanner进阶 接收整数数据时&#xff1a; 接收小数数据时&#xff1a; 例子&#xff1a; 可以先这样弄出scanner的框架&#xff1a; 未完待续... ...