Java利器之UML类图详解

2023-05-16

前言

UML(Unified Modeling Language)中文统一建模语言,是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。 【维基百科】

最近看一些开源项目的时候,总是看到UML中的类图,一开始自己的做法就是跳过去类图的部分,不过后来又遇到了几次,就决定学习下,不能再选择逃避了,这也是一个即将优秀的程序探索者应该必备的素质。今天把自己学习到的内容记录一下(怕健忘…),相信对类图不清楚的朋友,通过读取这篇文章后也能有一个比较清晰的认识,让你看的懂,画的出。

类图作用

类图是软件工程的统一建模语言一种静态结构图,该图描述了系统的类集合,类的属性和类之间的关系。帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。学习好类图的绘制,是一位合格的软件工程师应有的技能。

类的UML图示

在UML类图中,类使用包含类名,属性,方法名及其参数并且用分割线分隔的长方形表示。例如最简单的一个类Person 类有两个属性分别是name和age,并提供对应的get和set方法。java类代码如下

/***********************************************************************
 * Module:  Person.java
 * Author:  Code4Android
 * Purpose: Defines the Class Person
 ***********************************************************************/

import java.util.*;

/** @pdOid 4615fa10-38a3-446e-a7d5-59dcb3e786b5 */
public class Person {
   /** @pdOid f314a698-c3c1-4ec7-a8ea-f8b2df107a29 */
   private String name = zhangsan;
   /** @pdOid 271c633b-87e5-4b41-9f70-2ce320635014 */
   private int age = 23;

   /** @pdOid ccf5b7c1-d005-4a5f-b823-9988f2dd6f91 */
   public String getName() {
      // TODO: implement
      return name;
   }

   /** @pdOid 83e01fba-b004-498e-b7ab-778de8be6dfa */
   public int getAge() {
      // TODO: implement
      return age;
   }

   /** @param name
    * @pdOid 9525895a-11bf-44a3-afed-b4a014540a98 */
   public void setName(String name) {
      // TODO: implement
      this.name=name;
   }

   /** @param age
    * @pdOid 16fd66cc-2af1-4fef-ae98-2a37f495a487 */
   public void setAge(int age) {
      // TODO: implement
      this.age=age;
   }

}

那么用类图表示如下,它很简单的表示出了类的所有信息。

这里写图片描述

通过上面的Person的类图,你应该可以看出类图有三部分组成,类名,属性和操作方法

类名

顾名思义就是类的名字,对应于Java类中的类名,如果该类是抽象类的话,在类名右下角会有一个(Abstract)表示,假如Person是一个抽象类的话,则UML类图如下

这里写图片描述

属性名

UML中的属性名就是Java中的成员变量,当然一个类可以没有属性也可以有任意多个属性。Java类中成员变量的修饰符,类型和默认值都可以在UML类图中体现出来。通用表示方法如下

可见性  名称:类型 [ = 默认值 ]

在Java类中可见性分为三类,分别是private,public 和protected,在类图中分别用符号-、+和#表示。通用表示方法中名称就成员变量的名字,类型就是成员变量的类型如String类型,int类型等,当然也可以是自定义类型。而后面的默认值是可选参数,如果我们没有给成员变量设置初始值,UML类图中就不显示,如上面Person类图,变量name,age没有设置初始值,如果此时我们给name和vaule分别设置默认值zhangsan,23。则UML类图如下

这里写图片描述

操作方法

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

类的操作方法通用表示方式如上,方法可见性和属性可见性是一致的,名称就是方法名,参数列表是可选像,可以是对个参数也是没有参数,若多个参数用英文逗号隔开,返回类型是一个可选项,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void),如果是构造方法,则无返回类型。

类之间的关系

在UML类图中类与类之间存在多种关系,如泛化(Generalization)关系,实现(Realization)关系,依赖(Dependence)关系,关联(Association)关系,聚合(Aggregation)关系, 组合(Composition)关系。

泛化(Generalization)关系

泛化关系也就是Java中的继承,类和类,接口和接口都可以是继承关系,父类又称作基类或超类,子类又称作派生类,类继承父类后可以实现父类的所以功能,并能拥有父类没有的功能。在UML中,泛化关系可以用带空心三角形的直线来表示;例如我们创建两个Java类Teachers和Students类如下代码

/***********************************************************************
 * Module:  Teachers.java
 * Author:  Code4Android
 * Purpose: Defines the Class Teachers
 ***********************************************************************/

import java.util.*;

/** @pdOid b54e2d34-d17e-4f2d-993d-563b8e007db4 */
public class Teachers extends Person {
   /** @pdOid 55b38630-1e30-449b-9cb7-f8ef9de59412 */
   private int tNumber;

   /** @pdOid f603d47d-a51f-4b0c-b10b-881842374f8a */
   public String teach() {
      // TODO: implement
      return "I am teaching";
   }

}


/***********************************************************************
 * Module:  Students.java
 * Author:  Code4Android
 * Purpose: Defines the Class Students
 ***********************************************************************/

import java.util.*;

/** @pdOid 6b8ac239-000e-46d3-8233-962a612c12bd */
public class Students extends Person {
   /** @pdOid 0c7627fd-fa78-4f60-a859-2b90274323e1 */
   private int sNumber;

   /** @pdOid 1f929347-b84a-4a54-9ca9-144de66c742b */
   public String study() {
      // TODO: implement
      return "I am learning";
   }

}

则UML类图如下

这里写图片描述

实现(Realization)关系

实现关系在java中就是一个类和接口之间的关系,接口中一般是没有成员变量,所有操作都是抽象的(abstract修饰),只有声明没有具体的实现,具体实现需在实现该接口的类中。在UML中用与类的表示法类似的方式表示接口,区别可在UML中类图中看出。如我们创建一个交通工具类接口IVehicle,并有一个形式速度方法声明travelSpeed,Java代码如下

/***********************************************************************
 * Module:  IVehicle.java
 * Author:  Code4Android
 * Purpose: Defines the Interface IVehicle
 ***********************************************************************/

import java.util.*;

/** @pdOid 7cbe9f91-a7d9-44b5-a743-280cbc464e61 */
public interface IVehicle {
   /** @pdOid 5e87ebbc-5647-4dc6-8c3c-d23857662584 */
   int travelSpeed();

}

对于交通工具,有很多种,不同交通工具都有一个速度,我们举两个例子,如HighSpeedRail(高铁,时速288KM)和Bicycle(自行车类时速20KM),则两个实现类代码为

/***********************************************************************
 * Module:  HighSpeedRail.java
 * Author:  Code4Android
 * Purpose: Defines the Class HighSpeedRail
 ***********************************************************************/

import java.util.*;

/** @pdOid 0ae31b48-07b0-4bcd-83ff-a8a7c7d94518 */
public class HighSpeedRail implements IVehicle {
   /** @pdOid a7693fd4-d6d4-4e93-a946-380f69011b13 */
   public int travelSpeed() {
      // TODO: implement
      return 288;
   }

}

/***********************************************************************
 * Module:  Bicycle.java
 * Author:  Code4Android
 * Purpose: Defines the Class Bicycle
 ***********************************************************************/

import java.util.*;

/** @pdOid c212a8c3-88db-48d8-a2a0-d381d2ee7f91 */
public class Bicycle implements IVehicle {
   /** @pdOid 9ac52769-7489-47b0-9079-4f63f84f1fde */
   public int travelSpeed() {
      // TODO: implement
      return 20;
   }

}

在UML中实现接口用虚线和带空心的三角形表示。则上面对应的UML类图如下

这里写图片描述

依赖(Dependence)关系

依赖关系是类与类之间最弱的关系,依赖可以简单的理解一个类使用了另一个类,这种使用关系具有临时性特征,但是一个类又会由于另一个类的改变而受到影响,例如在上面举的例子中,假如我们的Students类拥有一个Bicycle,那么要获取移动速度则需要使用Bicycle中获取速度的方法travelSpeed()方法。此时Students代码如下

/***********************************************************************
 * Module:  Students.java
 * Author:  Code4Android
 * Purpose: Defines the Class Students
 ***********************************************************************/

import java.util.*;

/** @pdOid 6b8ac239-000e-46d3-8233-962a612c12bd */
public class Students extends Person {
   /** @pdOid 0c7627fd-fa78-4f60-a859-2b90274323e1 */
   private int sNumber;

   /** @pdOid 1f929347-b84a-4a54-9ca9-144de66c742b */
   public String study() {
      return "I am learning";
   }

   /** @param bicycle
    * @pdOid 82bd76ff-f70c-4e25-bea5-8de19db4699c */
   public int moveSpeed(Bicycle bicycle) {
      return bicycle.travelSpeed();
   }

}

在UML中一栏用带箭头的虚线表示依赖,对应的UML类图如下

这里写图片描述

关联(Association)关系

关联关系表示一个类和另一类有联系,例如在上面的举例中每个Teachers都有个家庭住址与之对应,而此时Teacher和Address就形成了一对一的关联关系。如下

这里写图片描述

关联关系是一种包含关系,在UML中用一个带箭头的实线表示,箭头指向被包含类。在上图中你可能会发现在线上有1 ..1,这个是说明包含关系的。在UML类中有如下几种。

1..1 表示另一个类的一个对象只与该类的一个对象有关系

0..* 表示另一个类的一个对象与该类的零个或多个对象有关系

1..* 表示另一个类的一个对象与该类的一个或多个对象有关系

0..1 表示另一个类的一个对象没有或只与该类的一个对象有关系

* 任意多个对象关联

聚合(Aggregation)关系

聚合关系是表示整体与部分的关系,但是部分可以脱离整体而存在。例如一个Teachers对象有一辆汽车Car,此时Car就是Teachers的一部分,但是Car可以脱离Teachers而存在。在UML类中聚合关系用带空心菱形的直线表示。
这里写图片描述

组合(Composition)关系

组合关系也是一种部分和整体的关系,但是部分存活周期受到整体的影响,若整体不存在则部分也将不存在。此时部分需在整体的构造方法中创建。在UML类中,组合关系用带实心菱形的直线表示。

这里写图片描述

在文章的最后,附上本篇文章所画的完整的UML类图。

这里写图片描述

到此,本篇文章真的结束了,若文章有不足或者错误的地方,欢迎指正,以防止给其他读者错误引导。最后感谢LoveLion的系列文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java利器之UML类图详解 的相关文章

  • 第二届广东省大学生网络攻防大赛 pyre

    第二届广东省大学生网络攻防大赛 pyre 以前做过 pyc 逆向 xff0c 直接的 python exe 逆向还是第一次 xff1a 第一种方法 xff1a 用 pyinstxtractor py 将 exe 文件转换成 pyc 文件 用
  • 2022 年网刃杯 ez_algorithm

    2022 年网刃杯 ez algorithm 下载附件 xff1a 照例扔入 exeinfope 中查看信息 xff0c 64 位无壳 xff1a 照例运行一下 xff0c 查看主要回显信息 xff1a 照例扔入 IDA64 中查看伪代码
  • Base-N 算法加密解密实现:

    目录 Base N 算法加密解密实现 xff1a Base64 加密解密 xff1a xff08 C 语言 python xff09 Base32 加密解密 xff1a xff08 C 语言 xff09 Base N 算法加密解密实现 xf
  • 第二届广东省大学生网络攻防大赛 simple_re

    第二届广东省大学生网络攻防大赛 simple re 流程总结 xff1a xff08 思路原文出自 JANlittle 师傅 xff09 程序将关键函数以对象元素的形式存在对象里 xff0c 然后在申请内存中搭配指针间接调用 xff0c 关
  • 解析 DES 加密算法(C语言):

    目录 解析 DES 加密算法 C语言 xff1a DES 简介 xff1a DES 算法整体流程 xff1a DES 解密 xff1a C 语言代码实现加密解密逻辑 xff1a 解析 DES 加密算法 C语言 xff1a 内容修改自博客 x
  • x64dbg 基本使用技巧

    x64dbg 基本使用技巧 最近使用 DBG 多了起来 xff0c 所以查了一些资料来学习并整理成自适应的笔记 本文摘抄自 xff1a x64dbg 使用技巧与实用插件合集 官方网站 xff1a https x64dbg com DBG 根
  • freertos系统栈溢出检测机制简述

    FreeRTOS 提供了多种特性来辅助跟踪调试栈相关的问题 uxTaskGetStackHighWaterMark 函数 每个任务都独立维护自己的栈空间 xff0c 栈空间总量在任务创建时进行设定 uxTaskGetStackHighWat
  • 记一次 windows 桌面卡顿

    记一次 windows 桌面卡顿 这几天在 windows 桌面上的操作感觉非常不好 xff0c 一开始以为是电脑老化 网络卡顿 C 盘又被垃圾挤占空间 或什么自启动软件占了内存 xff0c 复制一个快捷键出来都要缓冲 然后就卸载了很多不常
  • 浏览 APT 报告中学习积累

    浏览 APT 报告中学习积累 工具网站积累 xff1a xff08 APT 报告搜寻网站 xff09 https ti qianxin com https feed watcherlab com index apt https malped
  • 《windows 程序设计》读书笔记 一

    目录 基础知识 主要的动态链接库 xff1a API 及内存管理模式 xff1a 第一个 Windows 程序解析 xff1a 头文件 xff1a Windows 程序的入口 xff1a MessageBox 函数 xff1a 基础知识 主
  • 《windows 程序设计》读书笔记 二

    目录 Unicode 历史及介绍 美国标准 ASCII xff1a Unicode 方案 xff1a 宽字符和 C 语言 xff1a 宽字符和 Windows xff1a Windows 函数调用 xff1a Unicode 和 Ascii
  • x86指令编码简述(机器码)

    目录 x86指令编码 xff1a 机器码的格式结构 xff1a Mod R M 字节与内存寻址模式探究 xff1a 实战部分机器指令类型 xff1a x86指令编码 xff1a 机器码的格式结构 xff1a 一般的 x86 机器指令格式 x
  • 记一次 cmd 打开 python 报错,环境变量已配置

    记一次 cmd 打开 python 报错 xff0c 环境变量已配置 输入 python 自动打开应用商店 xff0c 环境变量已配置 xff0c 并且我觉得我只有这一个 python 路径 xff01 排查了半天 xff0c 重启了半天
  • 《windows 程序设计》读书笔记 三

    目录 窗口与消息 窗口的创建 xff1a 系统结构 windows 窗口编程概述 xff1a HELLOWIN 程序及剖析 xff1a 若干难点 xff1a 用户程序调用系统还是系统调用用户程序 xff1a DefWindowProc 函数
  • 对 python 正则表达式字面字符串和模式字符串的一点思考

    python 的正则表达式是与 Perl 语言类似的正则表达式匹配操作 xff1a 模式和被搜索的字符串既可以是 Unicode 字符串 xff0c 也可以是 8 位字节串 xff0c 但是 Unicode 字符串与 8 位字节串不能混用
  • 记一次 PEview 的报错修正

    记一次 PEview 的报错修正 从 逆向工程核心原理 中提到的 https reversecore com 111 中下载的 PEview 在处理 32 位程序时其它目录都还行 xff0c 当点到 IMAGE NT HEADERS gt
  • Android5.0 Telephony框架初步分析--telecomm

    3 2 Telecomm关键类初始化和相互关系 3 2 1 Telecomm简述 Android5 0在Telephony的变化又比较大 xff0c 增加了一个Telecomm模块 xff0c 它位于界面应用如InCallUI和Phone框
  • freertos应用程序常见错误排查

    freertos系统应用程序常见问题 对一些比较常见的问题 xff0c 下面简要的以 FAQ 问答 的形式给出可能的原因和解决方法 问题现象 xff1a 在一个 Demo 应用程序中增加了一个简单的任务 xff0c 导致应用程序崩溃 任务创
  • 自下而上和自上而下的注意力模型《Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering》

    本文有点长 xff0c 请耐心阅读 xff0c 定会有收货 如有不足 xff0c 欢迎交流 xff0c 另附 论文下载地址 一 文献摘要介绍 Top down visual attention mechanisms have been us
  • 从腾讯VasSonic源码剖析到webview优化的思考

    提到 android的webView xff0c 我想大家对它都有点恨之入骨 xff0c 因为它和ios的UIWebView的性能实在差的太远了 xff0c 尤其在4 4以下 xff0c 加载个页面慢的要死 xff0c 出现白屏时间过长 没

随机推荐

  • 在VSCode上运行C/C++程序【满满的“肝”货】

    文章目录 一 下载与安装vscode 61 61 下载 61 61 61 61 安装 61 61 二 配置编译器MinGW1 下载2 解压3 添加环境变量 三 安装vscode插件1 安装Chinese2 安装c c 43 43 四 运行c
  • ADRC——ESO扩张状态观测器simulink实现(含代码)

    2022 12 10改 我重新搭建了一个simulink模型文件 xff0c 已上传网盘 xff1a xff08 有问题请评论提出 xff0c 有空会改正 xff09 链接 xff1a https pan baidu com s 1EIfz
  • ADRC——TD微分跟踪器simulink实现(含代码)

    1 理论基础 参照 从PID技术到 34 自抗扰控制 34 技术 对于离散系统 xff1a 其中 xff0c h为采样时间 r确定跟踪速度 xff0c 称为速度因子 xff1b h0起对噪声的滤波作用 xff0c 成为滤波因子 fst函数定
  • ADRC——一阶ESO扩张状态观测器simulink实现及C语言代码

    理论部分见我之前的博客 xff0c 一阶ESO相比起来实现更简单 xff0c 也更好理解 xff0c 可帮助新手入门使用 虽然常见的物理系统 xff0c 绝大多都是二阶系统 xff0c 如F 61 ma 做位置控制时 xff0c 一般用二阶
  • ubuntu 安装scipy出现的问题

    遇到的问题 xff1a no lapack blas resources found 解决方法 xff0c 安装lapack sudo apt get install liblapack dev 然后重新安装scipy xff0c 这次遇到
  • 【软考高项笔记】第2章 信息技术发展2.2 新一代信息技术及应用(★)

    2 2 新一代信息技术及应用 xff08 xff09 2 2 1 物联网IOT 通过信息传感设备 xff0c 将物品和互联网相连接 xff0c 进行信息交换和通信 1 技术基础 物联网架构 感知层 xff1a 传感器 网络层 xff1a 互
  • Ubuntu12.04的汉化

    博主装上了Ubuntu12 04后进入系统才发现是英文版 xff0c 看着挺费劲的 xff0c 所以需要汉化一下 本文适用于ubuntu 12 04英文版的系统 1 进入ubuntu系统 xff0c 在顶部齿状标志找到system 2 在p
  • freertos优化版printf、sprintf、snprintf

    优化版printf sprintf snprintf printf stdarg c 当调用标准 C 库函数时 xff0c 栈空间使用量可能会急剧上升 xff0c 特别是 IO 与字符串处理函数 xff0c 比如 sprintf 在 Fre
  • 分享一下我参加开发者大会以来自己的总结(仅供参考)

    手机游戏设计 1选材类型符合移动平台特性 2剧情背景知名度高 3选材定义自己的用户 xff0c 用户觉得游戏的玩法 游戏设计法则 xff08 无需全部实现 xff0c 根据自己游戏类型找和适合法则结合 xff09 法则 1 xff1a 富有
  • 时钟周期、机器周期、指令周期的概念及三者之间的关系;定时器及计数器

    时钟周期 时钟周期也称为振荡周期 xff0c 定义为时钟脉冲的倒数 可以这样来理解 xff0c 时钟周期就是单片机外接晶振的倒数 xff0c 例如12M的晶振 xff0c 它的时间周期就是1 12 us xff0c 是计算机中最基本的 最小
  • 自旋锁-原理

    跟互斥锁一样 xff0c 一个执行单元要想访问被自旋锁保护的共享资源 xff0c 必须先得到锁 xff0c 在访问完共享资源后 xff0c 必须释放锁 如果在获取自旋锁时 xff0c 没有任何执行单元保持该锁 xff0c 那么将立即得到锁
  • openvslam------slam解读系列

    是什么 openvslam是日本先进工业科技研究 xff08 National Institute of Advanced Industrial Science and Technology xff09 所于2019年5月20日开源的视觉S
  • Hadoop编程学习1--WordCount

    span class hljs keyword package span org apache hadoop examples span class hljs keyword import span java io IOException
  • p2p传输实时视频流

    HYP2P是好游科技开发的p2p sdk xff0c 利用nat穿透的原理实现p2p打洞 xff0c 主要用于实时音视频的传输 使用时可以配置成tcp模式或udp模式 xff0c tcp模式会自动帮您解决丢包 乱序 重传问题 中转模式则是基
  • 笑谈Android图表------MPAndroidChart

    MPAndroidChart是一款基于Android的开源图表库 xff0c MPAndroidChart不仅可以在Android设备上绘制各种统计图表 xff0c 而且可以对图表进行拖动和缩放操作 xff0c 应用起来非常灵活 MPAnd
  • 详谈高大上的图片加载框架Glide -应用篇

    在Android设备上 xff0c 加载网络图片一直是一个头疼的问题 xff0c 因为Android设备种类繁多 xff08 当然最主要的是配置 xff09 xff0c 处理的稍不周到轻则应用卡顿 xff0c 严重者就会出现OOM的 xff
  • 微信小程序开发环境搭建

    微信小程序可谓是今天最火的一个名词了 xff0c 一经出现真是轰炸了整个开发人员 xff0c 当然很多App开发人员有了一个担心 xff0c 微信小程序的到来会不会给移动端App带来一个寒冬 xff0c 身为一个Android开发者我是不相
  • 实现APP定位功能

    源码传送门 若你不小心点击进入GitHub了捎带给个star 前言 最近更新项目中用的百度定位SDK时遇见了一个奇葩的问题 当升级SDK后百度定位一直返回505 通过百度定位官网查看该码表示AK非法或者不存在 很纠结 于是自己又写了一个de
  • Linux系统命令行创建新文件

    linux命令行创建文件 方法有许多 xff0c 下面简单介绍一下 方法1 使用cat命令 cat span class token operator gt span sample1 span class token punctuation
  • Java利器之UML类图详解

    前言 UML xff08 Unified Modeling Language xff09 中文统一建模语言 xff0c 是一种开放的方法 xff0c 用于说明 可视化 构建和编写一个正在开发的 面向对象的 软件密集系统的制品的开放方法 UM