软件项目管理【UML-类图】

2023-09-18 11:45:43

前言

UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。也就是说,掌握UML的20%,就能做80%的事情。对于程序员来说,最频繁使用的莫过于类图

目录

前言

 一、什么是类图

二、类图中类表示法

三、类图中具体类、抽象、接口和包的表示法

在UML类图中表示具体类

在UML类图中表示抽象类

在UML类图中表示接口

在UML类图中表示包

四、类图中表示关系

实现关系

泛化关系

关联关系

依赖关系

聚合关系

组合关系

Java开发中区别聚合和组合

五、例题

关系练习

具体练习


一、什么是类图

类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。类图中最基本的元素是类、接口。软件设计师设计出类图后,程序员就可以用代码实现类图中包含的内容。

二、类图中类表示法

类图标由三个部分组成:第一个部分是类名,第二个部分是属性,第三个部分是操作

  • “+”表示 public
  • “-”表示 private
  • “#”表示 protected
  • 不带符号表示 default

类名在它的命名空间中唯一。类名以大写字母开头,省略多个单词之间的空格。

属性和操作在类的范围内必须无二义。属性和操作是以小写字母开头后续单词的首字母大写,且同样省略空格

  • 属性规格说明格式:

可见性 属性名称:类型 [多重性] = 默认值 {特性字符串}

  • 操作规格说明格式:

可见性 操作名称(参数名称:类型):返回值 {特性字符串}

三、类图中具体类、抽象、接口和包的表示法

在UML类图中表示具体类

具体类在类图中用矩形框表示,矩形框分为三层:第一层是类名字。第二层是类的成员变量;第三层是类的方法。成员变量以及方法前的访问修饰符用符号来表示:

在UML类图中表示抽象类

抽象类在UML类图中同样用矩形框表示,但是抽象类的类名以及抽象方法的名字都用斜体字表示,

在UML类图中表示接口

接口在类图中也是用矩形框表示,但是与类的表示法不同的是,接口在类图中的第一层顶端用构造型 <<interface>>表示,下面是接口的名字,第二层是方法。

此外,接口还有另一种表示法,俗称棒棒糖表示法,就是类上面的一根棒棒糖(圆圈+实线)。圆圈旁为接口名称,接口方法在实现类中出现。

在UML类图中表示包

类和接口一般都出现在包中,UML类图中包的表示形式

四、类图中表示关系

类和类、类和接口、接口和接口之间存在一定关系,UML类图中一般会有连线指明它们之间的关系。关系共有六种类型,分别是实现关系、泛化关系、关联关系、依赖关系、聚合关系、组合关系,

实现关系

实现关系是指接口及其实现类之间的关系。在UML类图中,实现关系用空心三角和虚线组成的箭头来表示,从实现类指向接口。在Java代码中,实现关系可以直接翻译为关键字 implements

泛化关系

泛化关系(Generalization)是指对象与对象之间的继承关系。如果对象A和对象B之间的“is a”关系成立,那么二者之间就存在继承关系,对象B是父对象,对象A是子对象。例如,一个年薪制员工“is a”员工,很显然年薪制员工Salary对象和员工Employee对象之间存在继承关系,Employee对象是父对象,Salary对象是子对象。

在UML类图中,泛化关系用空心三角和实线组成的箭头表示,从子类指向父类。在Java代码中,对象之间的泛化关系可以直接翻译为关键字 extends

关联关系

关联关系(Association)是指对象和对象之间的连接,它使一个对象知道另一个对象的属性和方法。在Java中,关联关系的代码表现形式为一个对象含有另一个对象的引用。也就是说,如果一个对象的类代码中,包含有另一个对象的引用,那么这两个对象之间就是关联关系。

关联关系有单向关联和双向关联。如果两个对象都知道(即可以调用)对方的公共属性和操作,那么二者就是双向关联。如果只有一个对象知道(即可以调用)另一个对象的公共属性和操作,那么就是单向关联。大多数关联都是单向关联,单向关联关系更容易建立和维护,有助于寻找可重用的类。

两个关联中还存在自关联

在UML图中,双向关联关系用带双箭头的实线或者无箭头的实线双线表示。单向关联用一个带箭头的实线表示,箭头指向被关联的对象。这就是导航性(Navigatity)。

以下就表示Employee关联了TimeCard,为单向关联

一个对象可以持有其它对象的数组或者集合。在UML中,通过放置多重性(multipicity)表达式在关联线的末端来表示。多重性表达式可以是一个数字、一段范围或者是它们的组合。多重性允许的表达式示例如下:

  • 数字:精确的数量
  • *或者0..*:表示0到多个
  • 0..1:表示0或者1个,在Java中经常用一个空引用来实现
  • 1..*:表示1到多个

关联关系又分为依赖关联、聚合关联和组合关联三种类型。

依赖关系

依赖(Dependency)关系是一种弱关联关系。如果对象A用到对象B,但是和B的关系不是太明显的时候,就可以把这种关系看作是依赖关系。如果对象A依赖于对象B,则 A “use a” B。比如驾驶员和汽车的关系,驾驶员使用汽车,二者之间就是依赖关系。

在UML类图中,依赖关系用一个带虚线的箭头表示,由使用方指向被使用方,表示使用方对象持有被使用方对象的引用

依赖关系在Java中的具体代码表现形式为B为A的构造器方法中的局部变量方法或构造器的参数方法的返回值,或者A调用B的静态方法

下面我们用代码清单1和代码清单2所示的Java代码来演示对象和对象之间的依赖关系

代码清单1所示的B类定义了一个成员变量 field1,一个普通方法 method1() 和一个静态方法 method2()。

//代码清单1 B.java
public class B {
  public String field1;   //成员变量

  public void method1() {
    System.println("在类B的方法1中");
  }

  public static void method2() {                 //静态方法
    System.out.println("在类B的静态方法2中");
  }
}
代码清单2所示的A类依赖于B类,在A类中定义了四个方法,分别演示四种依赖形式。

/* 代码清单2 A.java
  A依赖于B
*/

public class A {
  public void method1() {
    //A依赖于B的第一种表现形式:B为A的局部变量
    B b = new B();
    b.method1();
  }

  public void method2() {
    //A依赖于B的第二种表现形式: 调用B的静态方法
    B.method2();
  }

  public void method3(B b)  {
    //A依赖于B的第三种表现形式:B作为A的方法参数
    String s = b.field1;
  }

  //A依赖于B的第四种表现形式:B作为A的方法的返回值
  public B method4() {
    return new B();
  }
}

聚合关系

聚合(Aggregation)是关联关系的一种特例,它体现的是整体与部分的拥有关系,即 “has a” 的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期(就如汽车和轮胎,当汽车销毁的时候,并不意味着轮胎也销毁了),部分可以属于多个整体对象,也可以为多个整体对象共享,所以聚合关系也常称为共享关系。例如,公司部门与员工的关系,一个员工可以属于多个部门,一个部门撤消了,员工可以转到其它部门。

在UML图中,聚合关系用空心菱形加实线箭头表示,空心菱形在整体一方,箭头指向部分一方

组合关系

组合(Composition)也是关联关系的一种特例,它同样体现整体与部分间的包含关系,即 “contains a” 的关系。但此时整体与部分是不可分的,部分也不能给其它整体共享,作为整体的对象负责部分的对象的生命周期。这种关系比聚合更强,也称为强聚合。如果A组合B,则A需要知道B的生存周期,即可能A负责生成或者释放B,或者A通过某种途径知道B的生成和释放。

例如,人包含头、躯干、四肢,它们的生命周期一致。当人出生时,头、躯干、四肢同时诞生。当人死亡时,作为人体组成部分的头、躯干、四肢同时死亡。

在UML图中,组合关系用实心菱形加实线箭头表示,实心菱形在整体一方,箭头指向部分一方

Java开发中区别聚合和组合

在Java代码形式上,聚合和组合关系中的部分对象是整体对象的一个成员变量。但是,在实际应用开发时,两个对象之间的关系到底是聚合还是组合,有时候很难区别。在Java中,仅从类代码本身是区分不了聚合和组合的。如果一定要区分,那么如果在删除整体对象的时候,必须删掉部分对象,那么就是组合关系,否则可能就是聚合关系。从业务角度上来看,如果作为整体的对象必须要部分对象的参与,才能完成自己的职责,那么二者之间就是组合关系,否则就是聚合关系。

例如,汽车与轮胎,汽车作为整体,轮胎作为部分。如果用在二手车销售业务环境下,二者之间就是聚合关系。因为轮胎作为汽车的一个组成部分,它和汽车可以分别生产以后装配起来使用,但汽车可以换新轮胎,轮胎也可以卸下来给其它汽车使用。如果用在驾驶系统业务环境上,汽车如果没有轮胎,就无法完成行驶任务,二者之间就是一个组合关系。再比如网上书店业务中的订单和订单项之间的关系,如果订单没有订单项,也就无法完成订单的业务,所以二者之间是组合关系。而购物车和商品之间的关系,因为商品的生命周期并不被购物车控制,商品可以被多个购物车共享,因此,二者之间是聚合关系。

五、例题

关系练习

【UML】-- 类图练习题含答案_uml类图例题和答案_四月天行健的博客-CSDN博客

具体练习

UML类图例题及总结_软件工程类图例题_代码敲上天.的博客-CSDN博客​​​​​​​

具体还能到这里学习8. 面向对象——UML类图(Class Diagram) - 知乎 (zhihu.com)



 

更多推荐

AI Studio星河社区生产力实践:基于文心一言快速搭建知识库问答

还在寻找基于文心一言搭建本地知识库问答的方案吗?AIStudio星河社区带你实战演练(支持私有化部署)!相信对于大语言模型(LLM)有所涉猎的朋友,对于“老网红”知识库问答不会陌生。自从大模型爆火后,开发者都希望尽快进行开发实战,企业都希望尽快在产品中集成LLM的能力,结合业务快速落地,那最直接的方式就是构建知识库问答

算法 杨辉三角求解 java打印杨辉三角 多路递归打印杨辉三角 递归优化杨辉三角 记忆法优化递归 帕斯卡三角形 算法(十二)

1.杨辉三角:是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。--百度百科2.杨辉三角特点:1.每个数等于它上方两数之和

CATTI考试,拿证必看篇:CATTI备考,你不可不知的东西都在这里!

打工人,打工魂,打工都是人上人。在人才拥挤的就业市场里,我们如何能够脱颖而出,赢得一份好工作呢?于是很多人把目光投向了CATTI。CATTI是一项面向全社会的职业资格考试,全称为全国翻译专业资格(水平)考试。具有一定外语水平的人员,不分年龄、学历、资历和身份,均可报名参加相应语种二、三级的考试。本文将带大家快速了解这门

SkyWalking快速上手(一)——安装单机版SkyWalking、使用SkyWalking

文章目录什么是SkyWalking为什么选择SkyWalking安装步骤前置条件环境要求下载SkyWalking配置SkyWalkingSkywalking使用Agent配置Collector配置启动SkyWalking配置SkyWalking代理SkyWalking的监控功能分布式调用链追踪性能指标监控告警和报警总结

黑马JVM总结(六)

(1)常量池方法区的组成中都由一个叫做运行时常量池的部分,内部包含一个叫做StringTable的东西反编译二进制字节码:类的基本信息:常量池:方法定义:构造方法main方法:方法中有一些指令,通过指令#2去常量池中找这个静态指令常量池:#2它是要找java/lang/System类下的out变量,类型是java/io

负载均衡原理及应用

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

基于Java+SpringBoot+Vue的图书借还小程序的设计与实现(亮点:多角色、点赞评论、借书还书、在线支付)

图书借还管理小程序一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述五、系统实现5.1小程序界实现5.1.1首页展示5.1.2点赞、

MYSQL_

文章目录①.索引的概述②.二叉树和红黑树③.Hash建立索引结构④.B树的数据结构⑤.MyISAM存储引擎索引实现⑥.InnoDB索引实现(聚集)⑦.联合索引的设定①.索引的概述①.索引是帮助MySQL高效获取数据的排好序的数据结构②.mysql数据库的实现原理通过b+树实现的,b+树的原理是先找到所有的数据,然后折半

【 安全】什么是CSRF攻击?如何避免?开发的时候怎么预防?

文章目录前言CSRF概念CSRF原理CSRF攻击防御防御方法session工作原理几种常见的攻击类型CSRF攻击实例CSRF攻击的对象当前防御CSRF的几种策略验证HTTPReferer字段在请求地址中添加token并验证在HTTP头中自定义属性并验证Chrome浏览器端启用SameSitecookieCSRF工具的防

应用程序处理:TCP模块的处理

1、应用程序处理首先应用程序会进行编码处理,这些编码相当于OSI的表示层功能;编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于OSI的会话层功能。2、TCP模块的处理TCP根据应用的指示,负责建立连接、发送数据以及断开连接。TCP提供将应用层发来的数据顺利发送至对端的可靠传输。为

Go 字符串处理

一、字符串处理函数我们从文件中将数据读取出来以后,很多情况下并不是直接将数据打印出来,而是要做相应的处理。例如:去掉空格等一些特殊的符号,对一些内容进行替换等。这里就涉及到对一些字符串的处理。在对字符串进行处理时,需要借助于包“strings”下面讲解一下常用的字符串处理函数:1.ContainsfuncContain

热文推荐