【UML用户指南】-06-面向对象建模-关系(relationship)

目录

1、面向对象建模常见的关系

2、关系的组成元素

3、依赖关系

4、泛化关系

5、关联关系

关联的四种修饰

1.名称

2.角色

3.多重性

4.聚合

6、常用建模技术

6.1、对简单依赖建模

6.2、对单继承建模

6.3、对结构关系建模


1、面向对象建模常见的关系

依赖 (dependency)

它表示类之间的使用关系(包括精化、跟踪和绑定关系)。

例如,水管依赖热水器,对它们所运送的水进行加热。
 

泛化 (generalization)

它把一般类连接到它的特殊类,也称为超类/子类关系或父/子关系。

例如,观景窗是一种带有固定的大窗格的窗户,庭院窗是一种带有向两边开的窗格的窗户。
 

关联 (association)

是实例之间的结构关系。1对1、1对多、多对多等

例如,房间是由墙和一些其他事物组成的,墙上可以镶嵌门和窗,管道可以穿过墙体。
 

实现(realization)

它表示接口与类之间的关系 。(不作为后续重点)

其中的每一种关系都为组合抽象提供了不同的方法。
 

2、关系的组成元素

关系名、关系所连接的事物、关系的特性


3、依赖关系

说明一个事物(如类 Window)使用另一个事物(如类Event)的信息和服务,但反之未必。

在图形上,把依赖画成一条有向的虚线,指向被依赖的事物。

当要指明一个事物使用另一个事物时,就选用依赖。

在大多数情况下,在类与类之间用依赖指明一个类使用另一个类的操作,或者使用其他类所定义的变量和参量

如果被使用的类发生变化,那么另一个类的操作也会受到影响,因为这个被使用的类此时可能表现

出不同的接口或行为。

在一般情况下,用衍型区别依赖的不同含义

4、泛化关系

一般事物(称为超类或父类)和该事物的较为特殊的种类(称为子类或子)之间的关系。有时也

称泛化为“is-a-kind-of” 关系:

一个事物(如类BayWindow)是更一般的事物(如类 Window)的“一个种类”。泛化意味着子类的对象可以被用在父类的对象可能出现的任何地方,反之则不然。

换句话说,泛化意味着子类可以替换父类的声明。子类继承父类的特性,特别是父类的属性和操作。

若子类的一个操作的实现覆盖了父类的同样一个操作的实现,则这种情况称为多态性。其共同之处是,两个操作必须具有相同的特征标记(相同的名字和参数)。

在图形上,把泛化画成一条带有空心三角形大箭头的有向实线,指向父类,如图所示。当要表示父/子关系时,就使用泛化。

没有父类并且最少有一个子类的类称为根类或基类;

没有子类的类称为叶子类。

如果一个类只有一个父类,则说它使用了单继承;

如果一个类有多个父类,则说它使用了多继承。

5、关联关系

是一种结构关系,它指明一个事物的对象与另一个事物的对象间的联系。

给定一个连接两个类的关联,可以从一个类的对象联系到另一个类的对象。

关联的两端都连到同一个类是完全合法的。

从类的一个给定对象能连接到该类的其他对象。恰好连接两个类的关联叫做二元关联。尽管不太常见,但可以有连接多于两个类的关联,这种关联叫做n元关联。

在图形上,把关联画成一条连接相同类或不同类的实线。当要表示结构关系时,就使用关联。

关联的四种修饰

1.名称

关联可以有一个名称,用以描述该关系的性质。为了消除名称的歧义,可提供一个指出读名称方向的三角形,给名称一个方向

2.角色

当一个类参与了一个关联时,它就在这个关系中扮演了一个特定的角色。角色是关联中靠近它的一端的类对另一端的类呈现的面孔。可以显式地命名一个类在关联中所扮演的角色。

3.多重性

关联表示了对象间的结构关系。在很多建模问题中,说明一个关联的实例中有多少个相互连接的对象是很重要的。

一个(1)、零个或一个(0..1)、多个(0..*)、一个或多个(1..*)

一个整数范围(如2..5)

4.聚合

两个类之间的简单关联表示了两个同等地位的类之间的结构关系,这意味着这两个类在概念上是同级别的,一个类并不比另一个类更重要。

有时要对“整体/部分”关系建模,其中一个类描述了一个较大的事物(“整体”),它由较小的事物(“部分”)组成。这种关系称为聚合,它描述了“has-a”关系,意思是整体对象拥有部分对象。

其实聚合只是一种特殊的关联,它被表示为在整体的一端用一个空心菱形修饰的简单关联

空心菱形

6、常用建模技术

6.1、对简单依赖建模

是两个类之间的连接,其中的一个类只是使用另一个类作为它的操作参数

创建一个依赖关系,从含有操作的类指向被该操作用来作为参数的类。

下图中显示了一个从CourseSchedule到Course的依赖,因为Course被用作CourseSchedule的操作add和remove的参数。
 

6.2、对单继承建模

在结构或行为上与其他的类相似的类。可以把这样的每一个类建模为独立的、不相关的抽象。但更好的方法是提取所有共同的结构特征和行为特征,并把它们提升到较为一般的类中,特殊类从中继承这些特征。

给定一组类,寻找两个或两个以上的类中的共同职责、属性和操作

把这些共同的职责、属性和操作提升到较为一般的类中。如果需要,创建一个新类,用以指派这些元素

画出从每个特殊类到它的较一般的父类的泛化关系,用以表示较特殊的类继承较一般的类。
 

针对斜体的Security类、presentValue()方法

经常会遇到不完全的或不想让它有任何对象的非叶子类。通常把这样的类称为抽象类(abstract class)。

在UML中,通过把类名写为斜体,以指明这个类是抽象的,例如类 Security 就是如此。

同理,针对操作presentValue,它是不完全的,必须在较低的抽象层次用一定的方法实现

6.3、对结构关系建模

当用依赖或泛化关系建模时,可能是对表示了不同重要级别或不同抽象级别的类建模。给定两个类间的依赖,则一个类依赖另一个类,但后者没有前者的任何信息。给定两个类间的泛化关系,则子类从它的父类继承,但父类没有任何子类所特有的信息。简而言之,依赖和泛化关系都是不对称的。

当用关联关系建模时,是在对相互同等的两个类建模。给定两个类间的关联,则这两个类以某种方式相互依赖,并且常常从两边都可以导航。

依赖是使用关系,泛化是“is-a-kind-of”关系,而关联描述了类的对象之间相互作用的结构路径。

结构建模过程

关联关系

  • 对于每一对类,如果需要从一个类的对象到另一个类的对象导航,就要在这两个类之间说明一个关联。这是关联的数据驱动观点。
  • 对于每一对类,如果一个类的对象要与另一个类的对象相互交互,而后者不作为前者的过程局部变量或者操作参数,就要在这两个类间说明一个关联。这是关联的行为驱动观点。
  • 对于这样的每一个关联,要说明其多重性(特别是当多重性不为*时,其中*是默认的多重性)和角色名(特别是在有助于解释模型的情况下)。
  • 如果关联中的一个类与另一端的类相比,前者在结构或者组织上是一个整体,后者看起来像它的部分,则在靠近整体的一端用一个菱形对该关联进行修饰,从而把它标记为聚合。
  • 怎样才能知道一个给定类的对象何时必须与另一个类的对象相互作用?答案是,CRC 卡和用况分析非常有助于考虑结构性和行为性脚本。在有两个或两个以上的类用数据关系进行交互的地方说明一个关联。

从该图的左下部开始,可以找到名称为Student、Course和Instructor的类。在Student和Course之间有一个关联,它描述了学生参加的课程。同时,每一名学生可以参加任意门数的课程,而每一门课程可以由任意名学生参加。类似地,在Course和Instructor之间也有一个关联,它描述了教师所教的课程。每一门课至少有一名教师,而每一名教师可以教零到多门课。每门课精确地属于一个系。

School和Student以及它和Department之间的关系有点不同。在这里可以看到聚合关系。一所学校可以有零到多名学生,一名学生可以是在一所或者多所学校注册的学员,一所学校可以有一个或多个系,每个系只能属于一所学校。可以不用聚合修

饰而用简单的关联,但通过说明School是整体,Student和Department是部分,可以说清楚在组织上哪个高于哪个。因此,学校在一定程度上由学生和学生所在的系来定义。类似地,实际上学生和系并不是与他们所属的学校无关,而是从他们的学校能得到他们的身份。

在Department和Instructor之间有两个关联。其中的一个关联说明可以指派一名教师到一个或多个系中,而一个系可以有一名或多名教师。由于在学校的组织结构中系比教师的层次要高,所以这要用聚合来建模。另一个关联表明一个系只能有一名教师是系主任。这种建模方式说明,一名教师最多是一个系的系主任,并且某些教师不是任何系的系主任。
 

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

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

相关文章

遍历数组1

package demo; import java.util.ArrayList; public class Arrilist { public static void main(String[] args) { ArrayList<String>listnew ArrayList<>(); list.add("汤神"); list.add("yyx"); list.add("hong go…

pyqt绘制各种直线

pyqt绘制各种直线 介绍效果代码 介绍 使用pyqt绘制各种直线 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QPainter, QPen, QPainterPath, QColor, QBrush from PyQt5.QtCore import Qt, QPoint, QLineF, QPointFclass…

JVM 指针压缩

运用java内存对齐填充&#xff0c;对java内存进行8字节划分&#xff0c;java对象指针映射到每个划分区域上&#xff0c;使得4个字节&#xff08;32位&#xff09;表示2^32个地址&#xff0c;从而使4个字节指针映射32G内存空间。 1.为什么进行指针压缩&#xff1a; jvm从32位变…

【全开源】Java代驾小程序APP代驾跑腿源码微信小程序代驾源码

&#x1f697;代驾小程序&#xff1a;便捷、安全的出行新选择 一、引言&#xff1a;出行新风尚 在如今繁忙的都市生活中&#xff0c;出行问题一直是人们关注的焦点。代驾小程序的出现&#xff0c;为我们提供了一种便捷、安全的出行新选择。无论是酒后不能驾车&#xff0c;还是…

开放式虚拟化格式1.0和2.0有什么区别

开放式虚拟化格式&#xff08;Open Virtualization Format&#xff0c;简称OVF&#xff09;是一种用于描述、打包、和分发虚拟机的标准格式。OVF 1.0和OVF 2.0是这个标准的两个不同版本。以下是它们之间的一些主要区别&#xff1a; 1. **扩展性**&#xff1a; - OVF 1.0主要…

牛客网刷题 | BC116 [NOIP2013]记数问题

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 试计算在区间1 到n…

深度学习之动量momentum介绍

本章节将介绍深度学习中动量的相关概念和应用。 1. 动量的基本原理 动量是一种用于加速梯度下降的技术。 它通过累积过去梯度的指数加权平均来计算当前更新方向。 这样可以增强梯度下降的稳定性,加快收敛速度。 2. 动量的数学公式 动量更新公式为:v γv - η∇L(θ) 其中v是…

LeetCode:环形链表II

文章收录于LeetCode专栏 LeetCode地址 环形链表II 题目 给定一个链表&#xff0c;返回链表开始入环的第一个节点。如果链表无环&#xff0c;则返回null。   为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾连接到链表中的位置&#xff08;索引从0开始&#…

安防监控视频平台LntonCVS视频监控汇聚平台遏制校园暴力保护校园学生安全应用方案

未成年人被誉为祖国的花朵&#xff0c;是我们国家的未来。然而&#xff0c;最近频繁曝出的未成年霸凌事件却引发了社会的广泛关注。这些事件手段残忍&#xff0c;事态恶劣&#xff0c;引发了全社会对如何保护未成年身心健康、规避霸凌事件发生的深刻思考。 为了更好地保障学生的…

使用软件分享--剪映(不需要会员版)剪映 Jianying_pro_3_2_0_8778_beta9_jianyingpro_beta(Windows)

专栏介绍&#xff1a;本专栏主要分享一些实用的软件&#xff08;Po Jie版&#xff09;&#xff1b; 声明1&#xff1a;软件不保证时效性&#xff1b;只能保证在写本文时&#xff0c;该软件是可用的&#xff1b;不保证后续时间该软件能一直正常运行&#xff1b;不保证没有bug&am…

深度学习中多模态的融合策略

在深度学习中&#xff0c;多模态&#xff08;multimodal&#xff09;融合策略用于集成来自不同模态的数据&#xff0c;以提升模型的性能和泛化能力。多模态数据可以包括文本、图像、音频、视频、传感器数据等&#xff0c;通过有效融合这些不同类型的数据&#xff0c;能够从中提…

Java中的大小顶堆的实现方式

在java中没有一个现成的大小顶堆的数据结构&#xff0c;但可以用PriorityQueue类代替。 PriorityQueue默认是升序的&#xff0c;因此可以模拟小顶堆最小值始终在队列的最前面&#xff0c;如果要模拟大顶堆&#xff0c;需要重新定义Comparator方法&#xff1a; PriorityQueue&l…

深度学习-06-手动进行反向传播

深度学习-06-手动进行反向传播 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xf…

CentOS镜像源配置

CentOS镜像源配置 1. 基础镜像源配置 1.1 简介 CentOS&#xff0c;是基于Red Hat Linux提供的可自由使用源代码的企业级Linux发行版本&#xff1b;是一个稳定&#xff0c;可预测&#xff0c;可管理和可复制的免费企业级计算平台。 下载地址: https://mirrors.aliyun.com/ce…

【网关】工业智能网关-02

一 公司简介 保定飞凌嵌入式技术有限公司始于2006年&#xff0c;是一家专注嵌入式核心控制系统研发、设计和生产的高新技术企业&#xff0c;是国内最早专业从事嵌入式技术的企业之一。 经过十几年的发展与积累&#xff0c;公司拥有业内一流的软硬件研发团队&#xff0c;在北京…

执行shell脚本时为什么要写成./test.sh,而不是test.sh?

一定要写成 ./test.sh&#xff0c;而不是 test.sh 运行其它二进制的程序也一样&#xff01; 直接写 test.sh&#xff0c;linux 系统会去 PATH &#xff08;系统环境&#xff09;里寻找有没有叫 test.sh 的&#xff01; 而只有 /bin, /sbin, /usr/bin&#xff0c;/usr/sbin 这…

SuperMap GIS基础产品FAQ集锦(20240603)

一、SuperMap iDesktopX 问题1&#xff1a;请教一下&#xff0c;桌面把火星坐标系的数据投影转换为4326坐标系数据如何才能没有偏移呢&#xff1f; 11.1.1 【解决办法】可以使用iDesktopX提供的“电子地图坐标转换”插件实现对火星坐标系数据的纠偏。 问题2&#xff1a;请教…

堆排序pta

UML&#xff08;Unified Modeling Language&#xff09;类图是面向对象设计&#xff08;OOD&#xff09;中常用的一种图表&#xff0c;用于描述系统中的类、接口、以及它们之间的关系。下面是一个简单的步骤&#xff0c;指导你如何绘制UML类图&#xff1a; 确定类和接口&#…

麦肯锡:ChatGPT等生成式AI应用激增,大中华区增长最快

全球顶级咨询公司麦肯锡&#xff08;McKinsey & Company&#xff09;在官网发布了《he state of AI in early 2024:Gen AI adoption spikes and starts to generate value》&#xff0c;一份关于生成式AI应用的调查报告。 麦肯锡对多个国家/地区的1,363位管理者进行了调查…

前端表单校验完成之后,点击确认功能无反应FormInstance, FormRules

**产生原因&#xff1a;可能是在el-form 中添加的ref 前面加了“&#xff1a;”&#xff0c;也可能是ref中的值写错了** FormInstance, FormRules