UML 用例图、顺序图、状态图、类图、包图、协作图、流程图

2023-11-09

面向对象的问题的处理的关键是建模问题。建模可以把在复杂世界的许多重要的细节给抽象出。许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目的是展示出UML的精彩之处。

UML中有九种建模的图标,即:

  • 用例图

  • 类图

  • 对象图

  • 顺序图

  • 协作图

  • 状态图

  • 活动图

  • 组件图

  • 配置图


本课程中的某些部分包含了这些图的细节信息的页面链接。而且每个部分都有一个小问题,测试一下你对这个部分的理解。

为什么UML很重要?

为了回答这个问题,我们看看建筑行业。设计师设计出房子。施工人员使用这个设计来建造房子。建筑越复杂,设计师和施工人员之间的交流就越重要。蓝图就成为了这个行业中的设计师和施工人员的必修课。

写软件就好像建造建筑物一样。系统越复杂,参与编写与配置软件的人员之间的交流也就越重要。在过去十年里UML就成为分析师,设计师和程序员之间的“建筑蓝图”。现在它已经成为了软件行业的一部分了。UML提供了分析师,设计师和程序员之间在软件设计时的通用语言。

UML被应用到面向对象的问题的解决上。想要学习UML必须熟悉面向对象解决问题的根本原则――都是从模型的建造开始的。一个模型model就是根本问题的抽象。域domain就是问题所处的真实世界。

模型是由对象objects组成的,它们之间通过相互发送消息messages来相互作用的。记住把一个对象想象成“活着的”。对象有他们知道的事(属性 attributes)和他们可以做的事(行为或操作behaviors or operations)。对象的属性的值决定了它的状态state。

类Classes是对象的“蓝图”。一个类在一个单独的实体中封装了属性(数据)和行为(方法或函数)。对象是类的实例instances。

用例图

用例图Use case diagrams描述了作为一个外部的观察者的视角对系统的印象。强调这个系统是什么而不是这个系统怎么工作。

用例图与情节紧紧相关的。情节scenario是指当某个人与系统进行互动时发生的情况。下面是一个医院门诊部的情节。

“一个病人打电话给门诊部预约一年一次的身体检查。接待员找出在预约记录本上找出最近的没有预约过的时间,并记上那个时间的预约记录。”

用例Use case是为了完成一个工作或者达到一个目的的一系列情节的总和。角色actor是发动与这个工作有关的事件的人或者事情。角色简单的扮演着人或者对象的 作用。下面的图是一个门诊部Make Appointment用例。角色是病人。角色与用例的联系是通讯联系communication association(或简称通讯communication)

角色是人状的图标,用例是一个椭圆,通讯是连接角色和用例的线。

一个用例图是角色,用例,和它们之间的联系的集合。我们已经把Make Appointment作为一个含有四个角色和四个用例的图的一部分。注意一个单独的用例可以有多个角色。

用例图在三个领域很有作用。

  • 决定特征(需求)。当系统已经分析好并且设计成型时,新的用例产生新的需求

  • 客户通讯。使用用例图很容易表示开发者与客户之间的联系。

  • 产生测试用例。一个用例的情节可能产生这些情节的一批测试用例。


类图

类图Class diagram通过显示出系统的类以及这些类之间的关系来表示系统。类图是静态的-它们显示出什么可以产生影响但不会告诉你什么时候产生影响。

下面是一个顾客从零售商处预定商品的模型的类图。中心的类是Order。连接它的是购买货物的Customer和Payment。Payment有三种形 式:Cash,Check,或者Credit。订单包括OrderDetails(line item),每个这种类都连着Item。


UML类的符号是一个被划分成三块的方框:类名,属性,和操作。抽象类的名字,像Payment是斜体的。类之间的关系是连接线。

类图有三种关系。

  • 关联association-表示两种类的实例间的关系。如果一个类的实例必须要用另一个类的实例才能完成工作时就要用关联。在图中,关联用两个类之间的连线表示。

  • 聚合aggregation-当一个类属于一个容器是的一种特殊关系。聚合用一个带菱形的连线,菱形指向具有整体性质的类。在我们的图里,Order是OrderDetails的容器。

  • 泛化generalization-一个指向以其他类作为超类的继承连线。泛化关系用一个三角形指向超类。Payment是Cash,Check和Credit的超类。


一个关联有两个尾端。每个尾端可以有一个角色名role name来说明关联的作用。比如,一个OrderDetail实例是一个Order实例的项目。

关联上的方向性navigability箭头表示该关联传递或查询的方向。OrderDetail类可以查询他的Item,但不可以反过来查询。箭头方向 同样可以告诉你哪个类拥有这个关联的实现;也就是,OrderDetail拥有Item。没有方向性的箭头的关联是双向。

关联尾端的数字表示该关联另一边的一个实例可以对应的数字端的实例的格数,通过这种方式表达关联的多样性multiplicity。多样性的数字可以是一 个单独的数字或者是一个数字的范围。在例子中,每个Order只有一个Customer,但一个Customer可以有任意多个Order。

下面这个表给出了最普遍的多样性示例。
 

多样性 意义
0..1 0或1个实例. n..m符号表示有n到m个实例
0..*  or  * 没有实例格数的限制(包括没有).
1 只有一个实例
1..* 最少一个实例


每个类图包括类,关联和多样性表示。方向性和角色是为了使图示得更清楚时可选的项目。

包和对象图

为了简单地表示出复杂的类图,可以把类组合成包packages。一个包是UML上有逻辑关系的元件的集合。下面这个图是是一个把类组合成包的一个商业模型。

dependencies关系。如果另一个的包B改变可能会导致一个包A改变,则包A依赖包B。


包是用一个在上方带有小标签的矩形表示的。包名写在标签上或者在矩形里面。点化线箭头表示依赖

对象图Object diagrams用来表示类的实例。他们在解释复杂关系的细小问题时(特别是递归关系时)很有用。

这个类图示一个大学的Department可以包括其他很多的Departments。



这个对象图示上面类图的实例。用了很多具体的例子。

UML中实例名带有下划线。只要意思清楚,类或实例名可以在对象图中被省略。



每个类图的矩形对应了一个单独的实例。实例名称中所强调的UML图表。类或实例的名称可能是省略对象图表只要图的意义仍然是明确的。

顺序图

类图和对象图是静态模型的视图。交互图是动态的。他们描述了对象间的交互作用。

顺序图将交互关系表示为一个二维图。纵向是时间轴,时间沿竖线向下延伸。横向轴代表了在协作中各独立对象的类元角色。类元角色用生命线表示。当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线。

消息用从一个对象的生命线到另一个对象生命线的箭头表示。箭头以时间顺序在图中从上到下排列。


协作图

协作图也是互动的图表。他们像序列图一样也传递相同的信息,但他们不关心什么时候消息被传递,只关心对象的角色。在序列图中,对象的角色放在上面而消息则是连接线。


对象角色矩形上标有类或对象名(或者都有)。类名前面有个冒号(:)。

协作图的每个消息都有一个序列号。顶层消息的数字是1。同一个等级的消息(也就是同一个调用中的消息)有同样的数字前缀,再根据他们出现的顺序增加一个后缀1,2等等。

状态图

对象拥有行为和状态。对象的状态是由对象当前的行动和条件决定的。状态图statechart diagram显示出了对象可能的状态以及由状态改变而导致的转移。
我们的模型例图建立了一个银行的在线登录系统。登录过程包括输入合法的密码和个人账号,再提交给系统验证信息。

登录系统可以被划分为四种不重叠的状态:Getting SSN, Getting PIN, Validating, 以及 Rejecting。每个状态都有一套完整的转移transitions来决定状态的顺序。


状态是用圆角矩形来表示的。转移则是使用带箭头的连线表示。触发转移的事件或者条件写在箭头的旁边。我们的图上有两个自转移。一个是在Getting SSN,另一个则在上Getting PIN。

初始状态(黑色圆圈)是开始动作的虚拟开始。结束状态也是动作的虚拟结束。

事件或条件触发动作时用(/动作)表示。当进入Validating状态时,对象并不等外部事件触发转移。取而代之,它产生一个动作。动作的结果决定了下一步的状态。

活动图

活动图activity diagram是一个很特别的流程图。活动图和状态图之间是有关系的。状态图把焦点集中在过程中的对象身上,而活动图则集中在一个单独过程动作流程。活动图告诉了我们活动之间的依赖关系。

对我们的例子来说,我们使用如下的过程。

“通过ATM来取钱。”

这个活动有三个类Customer, ATM和 Bank。整个过程从黑色圆圈开始到黑白的同心圆结束。活动用圆角矩形表示。


活动图可以被分解成许多对象泳道swimlanes ,可以决定哪些对象负责那些活动。每个活动都有一个单独的转移transition连接这其他的活动。

转移可能分支branch成两个以上的互斥的转移。保护表达式(在[]中)表示转移是从一个分支中引出的。分支以及分支结束时的合并merge在图中用菱形表示。

转移也可以分解fork成两个以上的并行活动。分解以及分解结束时的线程结合join在图中用粗黑线表示

组件与配置图

组件component是代码模块。组件图是是类图的物理实现。

配置图Deployment diagrams则是显示软件及硬件的配置。

下面的配置图说明了与房地产事务有关的软件及硬件组件的关系。



物理上的硬件使用节点nodes表示。每个组件属于一个节点。组件用左上角带有两个小矩形的矩形表示。

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

UML 用例图、顺序图、状态图、类图、包图、协作图、流程图 的相关文章

  • EA14.0 中的“覆盖属性初始值设定项”行为更改为 EA12.5 中的“设置运行状态”

    我观察到 EA14 0 中的行为与 EA12 5 中的行为有所不同 Summary 在 EA12 5 中使用时Deployment Specification必须设置Instance Classifier on the Deployment
  • 构建这些用例的最佳方法是什么?

    目前 我已经定义了 3 个不同的用例 它们实际上只是业务流程中的 3 个步骤 假设我有一份人员名单 所有这些人都对获得一个或多个有限资源感兴趣 例如 他们是音乐会的座位 最终 我希望自动且公平地将这些人分配到可用席位 我使用几种不同的算法来
  • 在java中将关联、聚合和组合转换为代码?

    我知道java中关联 聚合和组合的转换有不同的表示方式 但是当我们将它们转换为代码 java类 时 它们都以相同的方式表示 就像老师教的学生一样 关联将用具有班级老师实例变量的学生类来表示 部门有教授 聚合也将用具有班级教授实例变量 数组
  • graphviz:记录带有粗体标题的节点

    我正在尝试使用 graphviz 来做一些类似于 UML 类图的事情 我想知道是否有一种方法可以使 register 样式的节点的第一个字段以粗体显示 以使其与其他字段不同 我的节点如下所示 digraph i node label
  • BPMN的优点和缺点?

    我希望您能告诉我从开发人员的角度来看 BPMN 的优点和缺点是什么 我将 UML 与 BPMN 进行比较 发现 UML 有很多优点和缺点 但 BPMN 却没有 这很大程度上取决于观众和目的 在建模语言方面 BPMN 和 UML 活动图涵盖了
  • 使用基于关联数组的 UML 建模类型

    假设有一个 PHP 子系统 它仅使用关联数组来存储某种结构化数据 因此 实际上在语言级别上没有机制来约束这些结构 但您希望在设计中使用 UML 来定义它们 E g 在 PHP 中 联系人可能是这样的关联数组 name gt John Doe
  • 我应该使用什么图来表示模块中功能之间的交互?

    我需要使用 UML 或 SysML 符号创建图表 我有由函数组成的模块 有些函数仅在模块 内部 使用 其他函数则由其他模块使用 Example MODULE 1有两个功能 func1 and func2 func2 uses func1 i
  • 如何在重写方法中表示调用基类方法?

    我有一个子类想要向基类函数添加更多功能 我如何表示它也执行基类函数而不仅仅是新添加的功能 有趣的问题 我用 Enterprise Architect 尝试过 它确实让我选择了父级的操作 但图中的显示没有改变 看来您需要为此使用注释 如你看到
  • 在 NetBeans 7.1.1 中创建 UML 类图

    我想安装 启用 NetBeans 插件来创建和查看 UML 图 如图所示here http wiki netbeans org wiki images b b8 Vista Nimbus Uml Screenshot NBLookAndFe
  • 如何快速理解任何产品的设计和代码流程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 建模/记录功能程序

    我发现 UML 对于记录 OO 系统的各个方面非常有用 特别是用于总体架构的类图和用于说明特定例程的序列图 我想为我的 clojure 应用程序做同样的事情 我目前对模型驱动开发不感兴趣 只是对交流应用程序如何工作感兴趣 UML 是函数式编
  • 学习 UML 的最佳来源是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 UML 活动图上显示异步操作

    我即将绘制 记录一些客户端 服务器连接建立代码 以更好地理解它 有几个操作是在单独的线程中异步完成的 连接线程 数据接收线程等 我应该在单独的图表上显示它们吗 我更愿意将其放在单个图表上以掌握整体视图 但不知道如何在活动图上表示它 我不确定
  • UML 聚合可以是双向的吗?

    我正在 Python 中实现一个具有 MVC 模式的应用程序 具有以下类定义 class Controller object def init self model view self model model self view view
  • 关联注入还是依赖注入?

    我正在研究依赖注入模式 我看过很多例子 其中一个典型的例子就是以XxxService XxxRepository为例 但我认为 根据UML概念 类XxxRepository应该是类XxxService的关联 为什么不称这种情况为关联注入 但
  • Dia:图表编辑器:盒子对象的限制?

    如标题所示 我尝试为 hte 3d 图形引擎 ogre3d 开发尽可能少的方案 问题是大图方案 Ogre Root 类需要相当多的从它下降的箭头 用关系箭头连接框的模型是它们只能通过边界周围的特定点 称为 关节 或其他东西 进入 退出 但现
  • 如何使用 js/uml 对 JavaScript 文件进行逆向工程?

    Goal 我的目标是从我的 JavaScript 项目 由多个 js 文件组成 中获取 UML 模型并将其存储为 XMI 我已经走了多远 我在网上搜索了一下 发现js uml是第一个去的地方 我已经设法让 js uml 插件与 Eclips
  • 有没有办法在 Visual Studio 或 MATLAB 中“映射”程序执行顺序?

    我所说的 地图 是指我有一个 主 函数 它调用内部的许多其他程序 我希望能够看到哪个文件首先运行 第二个 第三个等等 基本上 我希望能够请参阅这个大型 OOP 设计程序 创建者没有为其制作 UML 类图 中的依赖项列表和顺序 以帮助破译代码
  • 在用例建模中分解 CRUD

    我有一个后续问题用例图中的 CRUD https stackoverflow com questions 7772399 crud in a use case diagram 如果我需要分解复杂的用例 例如 管理用户 假设这很复杂 可以将它
  • UML 到 Java 代码生成工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • 给gazebo世界中加相机kinect

    media tlf 鸡肉卷 机械臂 抓取 robot grasp simulation models kinect这个文件夹复制到 home tlf tlf ws3 src kinova ros kinova gazebo models中
  • 人类文明进入下个纪元奇点:UFO听证会-恒温超导发现-GPT大模型

    今年以来 科技领域出圈的事件频繁发生 每一个事件都意味着一个领域的重大突破的可能 这些事件是UFO听证会 恒温超导LK99的论文 GPT类大模型的广泛应用 我常将这些事件串在一起思考 细思极恐 一种 火鸡与农场主 的恐惧感袭来 首先 人类文
  • 理论--支持向量机笔记

    以下内容笔记出自 跟着迪哥学python数据分析与机器学习实战 外加个人整理添加 仅供个人复习使用 1 支持向量机要解决的问题 找到最好的一个决策方程 将两类数据点分离 支持向量机是不只找到决策方程 还要找到最好的一个 如图 左边的决策边界
  • HW算法题:整数对最小和

    整数对最小和 给定两个整数数组array1 array2 数组元素按升序排列 假设从array1 array2中分别取出一个元素可构成一对元素 现在需要取出k对元素 并对取出的所有元素求和 计算和的最小值 注意 两对元素如果对应于array
  • 自定义鼠标Cursor转变成图片

    今天无意做到项目遇到一个好玩的事情 就是当我鼠标移到一个链接上面 并不是像正常那样出现一个小手 而是变成一个小十字架 下面看图当时第一眼看到总感觉哪里不对 噢噢噢噢 这样的 小手没了 居然是一个图片 这是其实就是css自定义鼠标指针样式为图
  • 软考-嵌入式系统设计师-笔记:计算机系统基础知识

    文章目录 数制及其转换 数据的表示 原码 反码 补码 移码 浮点数 奇偶校验 CRC校验 海明校验 计算机组成及主要部件的基本工作原理 计算机硬件组成 CPU组成 存储器 计算机体系结构 冯诺依曼结构和哈佛结构 CISC和RISC 流水线技
  • Python-考试向-第一学期知识点总结

    个人向 知识点总结 课后习题解析 前言 Python第一学期知识点 1 初识python 2 Python语言基础 2 1 Python语法特点 2 2 Python中的变量 2 3 基本数据类型 2 3 1数据类型 2 3 2 数据类型的
  • REQ 【CodeForces - 594D】【树状数组+离线查询+区间思维】

    题目链接 很好的一道题 昨晚上推的 今天由于代码能力太弱敲了半天 再不断的找到自己思维的BUG 于是RE了一发 T了一发 WA了一发 就Ac了 还不错 那我们来讲解一下题目的思路 我们知道对于一个值的欧拉函数值 就是它的值去乘上它所有的质数
  • 自然语言处理实验—分词算法(含python代码及详细例子讲解)

    自然语言处理实验 分词算法 最近在学自然语言处理 这是第一个上机实验自然语言处理的分词算法 也是自然语言处理比较入门的算法 和大家分享一下 首先 自然语言处理 英文是 Nature Language Process 简称 NLP 是人工智能
  • 【PHP教程(二)】php登陆验证(附代码)

    1 登陆脚本 2 受保护的网页示例 3 注销脚本 4 注意事项 5 Hash函数字符串转换 6 php登陆脚本 哈希值验证 可以使用 PHP 创建登录脚本 PHP 提供了用于处理用户身份验证和会话的内置函数和功能 这是登录系统的基本组件 这
  • 2023春节祝福系列第一弹(上)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载)

    2023春节祝福系列第一弹 上 放飞祈福孔明灯 祝福大家身体健康 附完整源代码及资源免费下载 目录 一 前言 二 一片星光闪烁的旋转星空 1 效果展示 2 相关源代码 3 语法解释 3 1 线性渐变 linear gradient 3 2
  • Java异常知识点总结

    Java异常知识点总结 1 异常处理机制主要回答了三个问题 What Where Why What 异常类型回答了什么被抛出 Where 异常堆栈跟踪回答了在哪抛出 Why 异常信息回答了为什么被抛出 2 Java异常体系 RuntimeE
  • Python的Object基类__repr__方法

    Python的Object基类 repr 方法 Python基类的內建方法 repr 是执行一个官方的 或者正式的 代表一个对象的字符串 也就是说可以将字符串转换成一个Python对象 如果可能的话 最好是有效的表达式字符串 如果不可能的话
  • Visual Studio 2017 如何更改缓存以及组件的路径,以保证VS2017正常启动

    当安装完Visual Studio 2017时 发现安装过程中设置的缓存路径或组件存放路径不合理 但一旦修改 会导致Visual Studio 2017出现项目加载失败等问题 修改方法是通过 regedit命令打开windows注册表 然后
  • 财务系统软件c语言,用vc++6.0编写一个简单的财务应用程序来计算职工所得的实际工资...

    满意答案 xfitijnf 2014 09 30 采纳率 51 等级 12 已帮助 32118人 又写了一个简单的 c语言 另外 我和一楼不是一个人 123456789101112131415161718192021222324252627
  • Redis为服务器设置密码

    以下以Windows版本为例 在 redis windows service conf 文件 设置 requirepass foobared requirepass 123456 masterauth
  • AD常用使用快捷键和技巧

    PCB布线常使用 ctrl m 测量长度 ctrl C 取消显示测量长度 Q 单位切换 shift ctrl r 取消显示标注 shift S 显示层切换 ctrl 右击 高亮显示一条线 ctrl D PCB 2D显示设置 层 透明度 A
  • OpenCV:imwrite函数保存图片

    imwrite函数功能 用于将图像保存到指定的文件 可以为各种格式的图像 函数原型 bool cv imwrite const String filename InputArray img const std vector
  • js实现input的赋值

    input框赋值 如下所示 是一个文本框的html代码 实际开发中 要涉及到将数据库中的数据取出然后放入input框中
  • UML 用例图、顺序图、状态图、类图、包图、协作图、流程图

    面向对象的问题的处理的关键是建模问题 建模可以把在复杂世界的许多重要的细节给抽象出 许多建模工具封装了UML 也就是Unified Modeling Language 这篇课程的目的是展示出UML的精彩之处 UML中有九种建模的图标 即 用