设计模式中的UML类图

news2025/7/27 4:27:16

在线绘图工具:

https://app.diagrams.net/

https://www.processon.com/

第一个需要挂梯子,但很好用,本文用它绘制样例图


最近在看Head First一书,即使在软件工程的课程中学习过UML类图如何绘制,但显然已经忘掉很多了..希望通过这篇博客拾起来吧

在下文中,将类图抽象为“节点”与“边”,从图论的角度将类图的概念抽象成这两种方式进行描述;其中,节点为具体类、抽象类、接口和包等实体的介绍,边即为他们之间关系的介绍,主要是泛化、关联与依赖关系。


目录

节点

接口

泛化关系

继承关系

实现关系

关联关系

聚合关系

组合关系

依赖关系

总结

References


节点

类是封装对象的一种结构,也是人们认识世界的一种抽象方法..

一般来说,类由两部分组成:1、标识类自身特性的属性集合 2、定义在属性集合上的操作/方法

常见的UML类图有以下两种:

其中,类图 (左) 从上至下分为三部分;第一部分为类名,第二部分是类的自身属性,每个属性开始的+ - #表示属性的公共、私有或保护权限,type为属性的类型,如 int  、string等,第三部分为类的方法,+ - #仍然代表方法权限,当然还有以static为标识的静态方法。 此外,default表示待定。

右边的类图就是一种简单版了,可在还不知道类的操作的情况下对对象进行抽象。

接口

接口的概念像所谓的组件、元素一样,都比较泛。

我对接口的概述:

接口是一类方法的集合。方法的实现、实现的对象与调用的对象都是default的, 接口它自己并不care这三者。

一个典型的接口如下所示:

其中,从上至下分为三部分,第一部分是以<< Interface>>作为接口的标识,在这之下是接口的名词;第二部分与第三部分跟类图类似,但不同的是接口中只提供抽象方法,此外,大多数接口中的属性都是一些常量。

值得说明的是,java在不同版本中逐渐增加了对接口内部属性与方法的权限支持,具体可参考:

java 接口(interface)在不同JDK版本中的变化_猎人在吃肉的博客-CSDN博客icon-default.png?t=N176https://blog.csdn.net/xiaojin21cen/article/details/104346018不同语言的接口多多少少有些不同,但不变的是,接口内部的方法一定是抽象方法;如果没了这个特性,那接口就是一个纯纯的类了也失去了存在的必要。

包的概念也比较泛,不同语言有着不同的实现。我们姑且认为包(packet)是某个封装好的代码集合吧,这个集合对外提供了一些接口/函数供调用。

如cv2是一个包名,一般来说这个包也是一个.class文件: 

 

除了包之外,还有一些模块、组件、注释之类的东东,暂且不管他们吧..

好了,描述完节点后,自然会联想起图中节点间的关系(包括节点的自环也就是与自身的关系)。

搞软件工程理论的那帮人使用了以下名词描述边的关系:继承关系、关联关系、聚合关系、泛化关系、组合关系、实现关系、依赖关系、信赖关系、引用关系..

但他们之间是否能够单独作为一个划分?这是很难说清的事情。

说实话,我看了一些不同的博客,甚至去问了下chatgpt,发现存在一些不同的分类方式..这个领域这么久了应该有统一的分类标准吧,但为啥各种复制粘贴别人教科书的博客又各不相同呢?

模糊的定义将导致滥用和不统一,严格意义的划分或许又无法简单地描述边的复杂...难受

我认为关系的划分可以由以下几部分构成:1、实体之间属性的关系  2、实体间关联关系的强弱

3、实体间关系的权限..

先给出chatgpt的定义吧:


  1. 继承关系(Is-A Relationship):表示一个类是另一个类的子类,继承关系用带有空心箭头的实线表示,箭头指向父类。继承关系是一种类之间的关系,也称为Is-A关系,如“一个圆是一个形状”。

  2. 关联关系(Has-A Relationship):表示两个类之间存在关联,关联关系用实线表示,箭头指向被关联的类。关联关系是一种对象之间的关系,也称为Has-A关系,如“一个人有一张身份证”。

  3. 聚合关系(Aggregation):表示整体与部分之间的关系,聚合关系用带空心菱形的实线表示,菱形指向整体。聚合关系是一种对象之间的关系,也称为Part-Of关系,如“一个班级有多个学生”。

  4. 组合关系(Composition):表示整体与部分之间的强关系,组合关系用带实心菱形的实线表示,菱形指向整体。组合关系是一种对象之间的关系,也称为Has-A关系,如“一台电脑由多个硬件组成”。

  5. 依赖关系(Dependency):表示一个类的实现依赖于另一个类,依赖关系用带箭头的虚线表示,箭头指向被依赖的类。依赖关系是一种类之间的关系,如“一个汽车需要燃料”。

  6. 实现关系(Realization):表示一个类实现了一个接口或抽象类,实现关系用带有空心箭头的虚线表示,箭头指向接口或抽象类。实现关系是一种类之间的关系,如“一个人实现了教师接口”。


根据国内的一些文章(教材没在身边,下次更新),有些文章将边的关系划分为为以下三种:泛化关系、关联关系、依赖关系。

各种关系的强弱顺序:

泛化 > 关联 > 依赖

 继承 = 实现 > 组合 > 聚合 > 依赖

其中,泛化关系定义了 is a 的特性,关联关系定义了 has a 的特性,依赖关系定义了using a的特性。 

泛化关系

泛化关系表示一般与特殊的关系,如子类如何特性化父类的属性与行为,同类个体间相同属性类型、行为的不同特性。

继承关系

 

实现关系

实现关系是指接口及其实现类之间的关系

 

值得说明的是,java中支持接口对象作为类属性(成员变量)。

关联关系

关联关系是抽象模糊的定义

 

聚合关系

集体与个体的关系

 

组合关系

整体与部分的关系(强联系),整体与部分是不可分的,部分也不能给其它整体共享

 

依赖关系

一种弱关联关系。如果对象A用到对象B,但是和B的关系不是太明显的时候,就可以把这种关系看作是依赖关系。但我觉得这个关系还是挺强的,可能是定义者想强调被依赖对象的可替代性?但也存在很多不可替代的依赖对象诶

 

总结

没啥总结的,多用或许就熟悉了

有空写写设计模式的文章..

References

 UML详解(1):类的关系与如何绘制类图_类图怎么画_凯文叔叔的博客-CSDN博客

30分钟学会UML类图 - 知乎 (zhihu.com)

Java 在线工具 | 菜鸟工具 (runoob.com)

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

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

相关文章

1、介绍与环境安装

文章目录前言主要特征安装安装检查查看httprunner版本创建项目创建新项目运行脚手架项目前言 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架&#xff0c;只需编写维护一份 YAML/JSON 脚本&#xff0c;即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。 …

Vue3电商项目实战-购物车模块6【16-登录后-合并购物车、17-登录后-商品列表、18-登录后-加入购物车、19-登录后-删除操作】

文章目录16-登录后-合并购物车17-登录后-商品列表18-登录后-加入购物车19-登录后-删除操作16-登录后-合并购物车 目的&#xff1a;登录后需要把把本地购物车合并&#xff0c;且清空本地购物车。 大致步骤&#xff1a; 编写合并购物车的API接口函数编写设置购物车数据的mutatio…

Containers--array类

Array 类 简介 Array 类是一个固定大小的数组&#xff0c;它的大小在编译时就已经确定了。Array 类的大小是固定的&#xff0c;因此它的大小不能改变。 数组是固定大小的序列容器:它们以严格的线性顺序保存特定数量的元素。 在内部&#xff0c;数组除了包含的元素之外不保留…

第十三届蓝桥杯省赛C++ A组 爬树的甲壳虫(简单概率DP)

题目如下&#xff1a; 思路 or 题解&#xff1a; 概率DP 状态定义&#xff1a; dp[i]dp[i]dp[i] 表示从树根到第 iii 层的期望 状态转移&#xff1a; dp[i](dp[i−1]1)∗11−pdp[i] (dp[i - 1] 1) * \frac{1}{1-p}dp[i](dp[i−1]1)∗1−p1​ 这个式子的意思是&#xff1a;…

Unity3D Shader系列之模板测试

一、 模板测试原理模板测试位于GPU渲染流水线的逐片元操作阶段&#xff0c;片元着色器完成之后就会进入模板测试&#xff0c;模板测试通过后再进入深度测试。我们的GPU中有一个模板缓冲区(Stencil Buffer)(Stencil即是模板的意思)&#xff0c;其大小为整个屏幕大小*8位&#xf…

Pytorch基础语法学习2——argparse模块

一、基本介绍 argparse 模块是 Python 内置的用于命令行参数解析的模块&#xff0c;可以通过少数代码中变量或者参数的改变以实现对整个代码项目的操控。对于大型代码项目(如代码超过1000行)&#xff0c;十分便捷 argparse 模块可以让人轻松编写用户友好的命令行接口&#xf…

企业级信息系统开发学习笔记1.7 基于XML配置方式使用Spring MVC

文章目录零、本节学习目标一、Spring MVC概述1、MVC架构2、Spring MVC3、使用Spring MVC的两种方式二、基于XML配置与注解的方式使用Spring MVC&#xff08;一&#xff09;创建Spring项目【SpringMVCDemo01】&#xff08;二&#xff09;在pom文件里添加相关依赖&#xff08;三&…

ConvMixer:Patches Are All You Need

Patches Are All You Need 发表时间&#xff1a;[Submitted on 24 Jan 2022]&#xff1b; 发表期刊/会议&#xff1a;Computer Vision and Pattern Recognition&#xff1b; 论文地址&#xff1a;https://arxiv.org/abs/2201.09792&#xff1b; 代码地址&#xff1a;https:…

Python编程训练题2

1.11 有 n 盏灯&#xff0c;编号 1&#xff5e;n&#xff08;0<n<100&#xff09;。第 1 个人把所有灯打开&#xff0c;第 2 个人按下所有编号为 2 的倍数的开关&#xff08;这些灯将被关掉&#xff09;&#xff0c;第 3 个人按下所有编号为 3 的倍数的开关&#xff08;其…

【华为OD机试2023】租车骑绿岛 C++ Java Python

【华为OD机试2023】租车骑绿岛 C++ Java Python 前言 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优),不能保证通过率。 Tips1:机试为ACM 模式 你的代码需要处理输入输出,input/cin接收输入…

如何实现在on ethernetPacket中自动回复NDP response消息

对于IPv4协议来说,如果主机想通过目标ipv4地址发送以太网数据帧给目的主机,需要在数据链路层填充目的mac地址。根据目标ipv4地址查找目标mac地址,这是ARP协议的工作原理 对于IPv6协议来说,根据目标ipv6地址查找目标mac地址,它使用的不是ARP协议,而是邻居发现NDP(Neighb…

Oracle启动数据库报ORA-01102解决办法

1.机器启动之后登录服务器使用sqlplus / as sysdba 登录数据库发现数据库并没有启动之前把数据库服务添加过开机自启动 2.使用startup命令启动数据库报错了 SYSorcl>startup; ORACLE 例程已经启动。 Total System Global Area 2471931904 bytes Fixed Size 2255752 byt…

框架——MyBatis的入门案例

框架概述1.1什么是框架框架&#xff08;Framework&#xff09;是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交与的方法&#xff1b;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义…

关基系统国产化全面落地,ZoomEye Pro支持信创资产识别

信创产业发展的核心动力是IT底层架构的独立自主&#xff0c;为了尽快推进关键信息基础设施系统的国产化替代&#xff0c;一方面国家不断推出相关政策&#xff0c;协调各方资源&#xff0c;提供强有力的政策支撑&#xff0c;另一方面也在各关基行业有序推进重要信息基础设施的国…

第四章:面向对象编程

第四章&#xff1a;面向对象编程 4.1&#xff1a;面向过程与面向对象 面向过程(POP)与面向对象(OOP) 二者都是一种思想&#xff0c;面向对象是相对于面向过程而言的。面向过程&#xff0c;强调的是功能行为&#xff0c;以函数为最小单位&#xff0c;考虑怎么做。面向对象&…

2024秋招BAT核心算法 | 详解图论

图论入门与最短路径算法 图的基本概念 由节点和边组成的集合 图的一些概念&#xff1a; ①有向边&#xff08;有向图&#xff09;&#xff0c;无向边&#xff08;无向图&#xff09;&#xff0c;权值 ②节点&#xff08;度&#xff09;&#xff0c;对应无向图&#xff0c;…

抓狂!谷歌账号又又登录异常?给你支招解决

最近&#xff0c;就有很多朋友向东哥反馈说&#xff0c;谷歌账号登录异常了&#xff0c;明明账号密码都是对的&#xff0c;愣是登不上去&#xff0c;严重影响工作进度&#xff0c;很是捉急。所以东哥今天就总结了一份谷歌账号登录异常的解决方案&#xff0c;希望能帮助到大家&a…

CAS详解

CAS详解一 简介二 CAS底层原理2.1.AtomicInteger内部的重要参数2.2.AtomicInteger.getAndIncrement()分析2.2.1.getAndIncrement()方法分析2.2.2.举例分析三 CAS缺点四 CAS会导致"ABA问题"4.1.AtomicReference 原⼦引⽤。4.2.ABA问题的解决(AtomicStampedReference 类…

Eslint、Stylelint、Prettier、lint-staged、husky、commitlint【前端代码校验规则】

一、Eslint yarn add typescript-eslint/eslint-plugin typescript-eslint/parser eslint eslint-config-prettier eslint-config-standard-with-typescript eslint-plugin-import eslint-plugin-n eslint-plugin-prettier eslint-plugin-promise eslint-plugin-react eslint-…

实验四:搜索

实验四&#xff1a;搜索 1.填格子 题目描述 有一个由数字 0、1 组成的方阵中&#xff0c;存在一任意形状的封闭区域&#xff0c;封闭区域由数字1 包围构成&#xff0c;每个节点只能走上下左右 4 个方向。现要求把封闭区域内的所有空间都填写成2 输入要求 每组测试数据第一…