UML类图全解析

1.UML的基本介绍

1.1什么是UML

        1.UML => 统一建模语言,是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果。

        2.UML本身是一套符号的规定,就像数学符号和化学符号一样,这样符号用于描述软件模型中各个元素和他们之间的关系,比如:类,接口,实现,泛化,依赖,组合,聚合等。

        3.使用UML来进行建模,比较老牌的工具是Rational Rose,eplise的一些插件,IDEA的插件:PlantUML,当然也可可以使用现代化的工具:Lucidchart,博思画板等进行建立UML模型。

1.2UML图

1.2.1什么是UML图

        画UML图的目的其实就是为了将自己的思想描述给别人,既可以对自己的抽象思路进行完整的实际复现,也可以将自己的思路呈现给别人去理解想法(软件是如何设计的),UML图在软件工程中很重要。

1.2.2UML图的分类

        1.用例图

        2.静态结构图:类图,对象图,包图,组件图,部署图。

        3.动态行为图:交互图(时序图与协作图),状态图,活动图。

        对于进行理解设计模式来说,类图是最重要的(描述类与类之间的关系),因为本身就是进行使用类来进行对Java程序软件架构。

2.UML类图的大体设计

2.1类图元素的结构拆分

        类图中进行表示一个类的时候,结构按以下的方式进行划分。

2.2类图元素中的符号是什么

        - 代表private,私有的。

        + 代表public,公有的。

        # 代表protected,受保护的。

        ~ 代表package/default,包可见的。

2.3类图中的依赖关系

        这里仅仅列举出几个较为常见的,详细的在后面进行介绍。

2.3.1继承关系

        继承(Inheritance)=> 进行使用实线 + 空心三角进行表示。

2.3.2依赖关系

        依赖(dependency)=> 进行使用实线中标识出依赖的具体关系的方式进行表示。

2.3.3聚合关系

        聚合(Aggregation)=> 进行表示两个类之间有聚合关系时使用空心菱形进行标识。

2.3.4组合关系

        组合(Composition)=> 进行使用实心菱形标识两个类之间具有组合关系。

3.详解UML类图中类关系的设计

3.1依赖关系

        依赖关系(Dependency)

3.1.1什么是依赖关系

        只要在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编译也无法通过。

3.1.2UML类关系设计方案

        这样就体现出来PersonServiceBean类中的对IDCard,Person,PersonDao,Department进行了依赖。

3.1.3PersonServiceBean类的设计

        可以看到PersonServiceBean分别在字段/方法参数/返回值/局部变量中进行运用到了这些类,所以说与这些类的关系是依赖关系。

public class PersonServiceBean {private PersonDao personDao;public void save(Person person) {}public IDCard getIDCard(Integer personId) {return new IDCard();}public void modify() {Department department = new Department();}}

3.2泛化关系

        泛化关系(Generalization)

3.2.1什么是泛化关系

        泛化关系其实就是继承关系,它是依赖关系的特例。

3.2.2UML关系图的设计

        这样就可以看出来,PersonServiceBean和DaoSupport是泛化(继承)关系。

3.2.3代码示例

        定义的抽象类:

public abstract class DaoSupport {public void save(Object entity) {}public void delete(Object id) {}
}

        定义的实现类:

public class PersonServiceBean extends DaoSupport {
}

3.3实现关系

        实现关系(Implementation)

3.3.1什么是实现关系

        实现关系就是A类实现了B接口,是依赖关系的特例。

3.3.2UML关系图的设计

        其中PersonService是一个接口,PersonServiceBean是一个实现类。

3.3.3代码示例

public interface PersonService {void delete(Integer id);
}
public class PersonServiceBean implements PersonService {@Overridepublic void delete(Integer id) {System.out.println("delete X");}
}

3.4关联关系

        关联关系(Association)

3.4.1什么是关联关系

        关联关系其实就是类与类之间的联系,是依赖关系的特例。

        关联关系具有导航性:即双向关系或者单向关系。

        关系具有多重性:

                1."1":标识有且仅有一个。

                2."0...":表示0个或者多个。

                3."0, 1":表示0个或者一个。

                4."n...m":表示n到m个都可以。

                5."m...*":表示至少m个。

3.4.2单向关联关系

3.4.2.1UML类图的设计

        这个UML类图进行展示的就是Person和IDCard单向的关联关系(Association)

        Person使用字段单向进行关联IDCard类。

3.4.2.2代码示例
public class IDCard {
}
public class Person {private IDCard idCard;
}

3.4.3双向关联关系

3.4.3.1UML类图的设计

3.4.3.2代码示例
public class IDCard {public Person person;
}
public class Person {private IDCard idCard;
}

3.5聚合关系

        聚合关系(Aggregation)

3.5.1什么是聚合关系

        聚合关系(Aggregation)表示的是整体和部分之间的关系,聚合关系最大的特征就是描述的整体和部分的关系,是可以分开的,并不是锁定强聚合的关系。聚合关系是关联关系的特例,所以它具有关联的导航性(单向/双向)和多重性(关联了多少个)。

3.5.2具体案例分析什么是聚合关系

        在生活中我们可能会使用电脑,使用电脑的时候需要进行装配键盘,显示器等,我们进行装配在台式主机上面的这些外设基本上都是可有可无的设备,可以插拔的。

        我们将主机进行抽象为Computer类,里面准备了两个字段,一个mouse进行装配Mouse,一个monitor进行装配Monitor。

        将鼠标抽象为Mouse类。

        将Monitor抽象为Monitor类。

        主机可以进行装配鼠标和显示器,其实就是Computer类可以进行装配Mouse类和Monitor类,并且由于主机没有这俩也能正常进行运行,所以Computer可以选择装配Mouse类,Monitor类,所以Computer类与Mouse类/Monitor类的关系是聚合的关系。

        聚合最重要的是可以将类聚合在本类中,也可以不聚合在本类中,一般是使用一个setter方法进行设置,可以设置,也可以不设置,这就是聚合。

3.5.3UML类图的设计

3.5.4代码示例

public class Monitor {
}
public class Mouse {
}
public class Computer {private Mouse mouse;private Monitor monitor;public void setMouse(Mouse mouse) {this.mouse = mouse;}public void setMonitor(Monitor monitor) {this.monitor = monitor;}
}

3.6组合关系

        组合关系(Composition)

3.6.1组合关系是什么?

        组合关系:就是整体与部分的关系,但是整体与部分不可以分开。

        这里要注意哦,聚合关系是可以分开的,组合关系是不可以分开的。

        组合关系的构建可以通过:1.内部直接组合(初始化时在内部直接进行)2.使用构造函数进行组合进去。

3.6.2使用内部直接进行组合

        内部直接进行组合就是在类初始化的时候,直接进行new一个相关对象。

3.6.2.1UML类图的设计

        在这里面进行设计的就是,IDCard对于Person是一个可组装也可以不组装的类,所以相互之间属于一个聚合的关系(Aggregation),但是Head类的对象在Person对象创建的时候,也会进行创建,生死与共,所以Head类与Person类属于是组合的关系(Composition)

3.6.2.2代码示例
public class Head {
}
public class IDCard {
}
public class Person {private IDCard idCard;private Head head = new Head();public void setIdCard(IDCard idCard) {this.idCard = idCard;}
}

3.6.3初始化时进行组合

        初始化时可以进行将字段中的需要进行组合进去的类的实例对象设置进去,这样也是一种组合的设计逻辑。

3.6.3.1UML类图的设计

3.6.3.2代码示例
public class Head {
}
public class IDCard {
}
public class Person {private IDCard idCard;private Head head;public Person(Head head) {}public void setIdCard(IDCard idCard) {this.idCard = idCard;}
}

3.6.4组合关系的精髓 => 不可分离性

        组合关系相对于聚合关系最大的不同就是不可分离性,聚合关系是可分离的,但是组合关系的设计理念就是不可分离的。

        Person与Head的不可分离性就体现在了创建Person对象的时候,会将Head对象一并进行创建,这就是不可分离特性的体现。

        虽然在我们的设计中,Person和IDCard在编码设计上是非强耦合的设计,但是如果在逻辑设计上,是一个强耦合设计(不可分离,同生共死)的设计时,其实这两个类也是要进行归结是组合关系(Composition)

        比如Person如果和IDCard是一个组合的关系,同生共死,那么其实在设计上,这两个就是组合关系,是同生共死的。

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

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

相关文章

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…

交叠型双重差分法

交叠型双重差分法(Staggered Difference-in-Differences, Staggered DiD)是一种扩展的双重差分(Difference-in-Differences, DiD)方法,用于处理多个时间点的政策干预或处理组(treatment group)并…

JavaWeb的小结02

第2章-第2节 一、知识点 HttpServletRequest请求对象、HttpServletResponse响应对象、响应内容类型Content-Type、请求转发、重定向、ServletContext对象。 二、目标 深刻理解HttpServletRequest对象的作用。 深刻理解HttpServletResponse对象的作用。 掌握HttpServletRequ…

企业必备:搭建大模型应用平台实操教程

最近AI智能体很火,AI智能体平台化产品肯定属于大公司的。但在一些场景下,尤其是对业务数据要求很高的公司,那就只能用私有大模型。不一定完全是为了对外提供服务,对内改造工作流也是需要的。所以 我感觉未来大部分企业都会搞一个…

普渡PUDU MT1:AI赋能,破解大面积场景清洁新挑战

普渡AI智能扫地机器人PUDU MT1:破解大面积场景清洁难题的新利器 在仓储物流、工业车间、交通枢纽、大型商场等大面积场景中,清洁难题一直是管理者们头疼的问题。这些区域面积广阔,清洁任务繁重,传统清洁方式难以胜任。然而,普渡机器人最新推出的AI智能扫地机器人PUDU MT1…

什么是 HTTP Get + Preflight 请求

当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时,意味着该请求涉及跨域资源共享 (CORS),并且该请求被预检了。理解这种请求的背景,主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …

ConcurrentHashMap在JDK1.7和1.8的区别,详解

目录 1.了解HashMap底层插入原理 2.ConcurrentHashMap 是什么? HashTable的实现 3.ConcurrentHashMap 1.7和1.8的区别 4、JDK1.7 中的ConcurrentHashMap实现原理 6、JDK1.8中的ConcurrentHashMap 7.链表转红黑树条件 1.8 put方法 8.并发扩容 9.总结 首先呢…

Origin正态分布检验

在spass中用Shapiro-Wilk检验--正态分布检测 Shapiro-Wilk检验--正态分布检测_spss shapiro-wilk检验-CSDN博客

数据服务-实时同步(sersync)

1. 概述 1.之前我们通过rsync定时任务实现定时备份/同步 2. 对于NFS我们需要进行实时同步 2. Sersync原理 3. 上手指南 环境主机web0110.0.0.7(nfs客户端)nfs0110.0.0.31(rsync客户端) (nfs服务端)backup10.0.0.41(rsync服务端) 3.1 rsync服务端准备 参考: 数据服务-备份服务…

好用便宜的头戴式耳机哪款好?强推四款高分爆单耳机精品!

音质,是耳机的灵魂。头戴式降噪耳机,以其卓越的音质表现,为您演绎音乐的真谛。无论是细腻的情感表达,还是震撼的音效体验,它都能让您感受到音乐的魅力所在。那好用便宜的头戴式耳机哪款好?,这里…

为什么芯片有多个不同的供电电压?

一、为什么芯片有多个不同的供电电压? 优化性能与功耗:芯片的核心部分(Core)和输入输出部分(IO)可能采用不同的电压。核心电压通常较低,以减少功耗和发热,提高能效;而IO电…

Linux驱动开发常用调试方法汇总

引言:在 Linux 驱动开发中,调试是一个至关重要的环节。开发者需要了解多种调试方法,以便能够快速定位和解决问题。 1.利用printk 描述: printk 是 Linux 内核中的一个调试输出函数,类似于用户空间中的 printf。它用于…

CSID-GAN:基于生成对抗网络的定制风格室内平面设计框架论文阅读

CSID-GAN: A Customized Style Interior Floor Plan Design Framework Based on Generative Adversarial Network 摘要前言II. CSID-GAN METHODA. Overall FrameworkB. Algorithm and Loss Function III. DATASETS AND EVALUATION METRICSA. DatasetsB. Evaluation Metrics IV.…

SAP MM学习笔记 - 豆知识10 - OMSY 初期化会计期间,ABAP调用MMPV/MMRV来批量更新会计期间(TODO)

之前用MMRV,MMPV来一次一个月来修改会计期间。 如果是老的测试机,可能是10几年前的,一次1个月,更新到当前期间,搞个100多次,手都抖。 SAP MM学习笔记 - 错误 M7053 - Posting only possible in periods 2…

【web安全】——逻辑漏洞

1.逻辑漏洞 1.1. 简介 逻辑漏洞就是指攻击者利用业务/功能上的设计缺陷,获取敏感信息或破坏业务的完整性。一般出现在密码修改、越权访问、密码找回、交易支付金额等功能处。 逻辑漏洞的破坏方式并非是向程序添加破坏内容,而是利用逻辑处理不严密或代码问题或固有不足&#x…

Timeline: 时间线轮播多图

对全国2014-2023年各省市的人口,做出动态柱状图/时间线轮播多图,即每隔一定时间间隔,自动的切换2014、2015、....2023各省市的人口(即2014-2023年全国省市人口排名前12的情况) 1、模板 # -*- coding: gbk -*- from pyecharts import option…

智慧农业案例 (二)- 智能化灌溉系统

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案,帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、领域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

使用Buildpacks构建Docker镜像

## 使用Buildpacks构建Docker镜像 ![](../assets/运维手册-Buildpacks-Buildpacks.io.png) ### Buildpacks简介 与Dockerfile相比,Buildpacks为构建应用程序提供了更高层次的抽象。具体来说,Buildpacks: * 提供一个平衡的控制,…

Elasticsearch学习笔记(五)Elastic stack安全配置二

一、手动配置http层SSL 通过前面的配置,我们为集群传输层手动配置了TLS,集群内部节点之间的通信使用手动配置的证书进行加密,但是集群与外部客户端的http层目前还是使用的自动配置,集群中HTTP的通信目前仍然使用自动生成的证书ht…

【EXCEL数据处理】000017 案例 Match和Index函数。

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000016 案例 Match和Index函数。使用的软件&#xff…