当前位置: 首页 > news >正文

【UML用户指南】-21-对基本行为建模-活动图

目录

1、概念

2、组成结构

2.1、动作

2.2、活动节点

2.3、控制流

2.4、分支

2.5、分岔和汇合

2.6、泳道

2.7、对象流

2.8、扩展区域

3、一般用法

3.1、对工作流建模

3.2、对操作建模


一个活动图从本质上说是一个流程图,展现从活动到活动的控制流

活动图能够展示并发和控制分支。

活动图用于对系统的动态方面建模。

包括对计算过程中顺序的(也可能是并发的)步骤进行建模。

也可以用活动图对步骤之间的值的流动进行建模。

活动图可以单独用来可视化、详述、构造和文档化对象群体的动态特性,也可以用于对一个操作的控制流建模。

交互图强调的是从对象到对象的控制流,而活动图强调的是从步骤到步骤的控制流。

一个活动是行为的一个持续发生的结构化执行。

活动的执行最终延伸为一些单独动作的执行,每个动作都可能改变系统的状态或者传送消息。

甘特图(Gantt chart)和波特图(Pert chart)

一方面,可以建立脚本的故事板,其中包括某些感兴趣的对象之间的交互以及它们之间传递的消息。在UML中,有两种方法对这些故事板建模:强调消息的时间顺序(使用顺序图)或强调参加交互的对象间的结构关系(使用通信图)

另一方面,可以用活动图对这些动态方面建模,它首先关注于对象间发生的活动,如图所示。从这方面看,活动图与波特图类似。活动图本质上是流程图,它强调随着时间的前进而发生的活动。你可以把活动图看作翻新花样的交互图。

交互图观察的是传送消息的对象,而活动图观察的是对象之间传送操作

1、概念

活动图(activity diagram)显示从活动到活动的流。

一个活动(activity)是一个状态机中进行的非原子的执行单元。活动的执行最终延伸为一些独立动作 (action)的执行,每个动作将导致系统状态的改变或消息传送。动作包括调用另一个操作,发送一个信号,创建或撤销一个对象,或者某些纯计算(例如对一个表达式求值)。

在图形上,活动图是顶点和弧的集合。

2、组成结构

动作、活动结点、流、对象值,以及注解和约束

2.1、动作

在一个用活动图建模的控制流中,

1)可能要计算一个设置属性值或返回某个值的表达式。

2)也可能要调用一个对象的操作,发送一个信号给对象,

3)甚至创建或撤销一个对象。

这些可执行的原子计算被称为动作

如下图所示,用一个两头为圆形的盒子来表示一个动作。在这个图符内部可以写一个表达式。

动作原子性、内部行为可不见、不可拆分、持续性

2.2、活动节点

活动结点 (activity node)是活动的组织单元。

通常,活动结点是内嵌的动作组,或者是其他嵌套的活动结点。

此外,活动结点具有可见的子结构。一般来说,活动结点会持续一段时间来完成。

把动作看成是活动结点的特例。动作是一个不能被进一步分解的活动结点。

类似地,可以把活动结点看作一个组合,它的控制流由其他的活动结点和动作组成。放大一个活动结点的细节,就会发现另一个活动图。

如图所示,在活动结点和动作之间没有表示法上的差别,只是活动结点可以有附加的部分,这些附加部分通常由编辑工具在后台维护。

2.3、控制流

当一个动作或活动结点结束执行时,控制流将马上传递到下一个动作或活动结点。可以用流箭头来说明这个流,显示从一个动作或活动结点到下一个动作或活动结点的控制路径。如下图所示,UML中用一条从前一动作指向后续动作不带事件标签的简单箭头表示一个流。

事实上,控制流会从某个地方开始,然后在某个地方结束(除非它是一个只有开始没有结束的无穷的流)。 可以用特殊的符号说明控制流的初始(一个实心圆)和结束(一个圆圈内的实心圆)

2.4、分支

用一个菱形来表示分支

一个分支可以有一个进入流和两个或多个离去流。在每个离去流上放置一个布尔表达式,在进入这个分支时被判断一次。

在所有这些离去流中,其监护条件不应该重叠(否则,控制流会有二义性),但是它们应该覆盖所有的可能性(否则,控制流可能会冻结)。

使用关键字else来标记一个离去转移,它表示如果其他的监护表达式都不为真时所执行的路径。

当两个控制路径重新合并时,也可以用带有两个输入箭头和一个输出箭头的菱形符号来表示。对于合并来说,无需监护条件。

为了获得迭代的效应,可以用一个动作设置迭代器的值,用另一个动作增加该迭代器的值,并用一个分支来判断该迭代是否结束。虽然UML提供了用于循环的结点类型,但是通常用文字比用图能更容易地表达这些。
 

2.5、分岔和汇合

在UML中,用同步棒来说明这些并行控制流的分岔和汇合。

一个同步棒是一条水平或垂直粗线。

并发控制流经常存在于独立的主动对象的语境中,而主动对象通常被建模为一个进程或线程。

分叉和汇合 常用于主动类、主动对象的进程、线程中。

        分岔表示把一个单独的控制流分成两个或更多的并发控制流。一个分岔可以有一个进入转移和两个或更多的离去转移,每一个离去转移表示一个独立的控制流。在这个分岔之下,与每一个路径相关的活动将并行地继续。从概念上说,这些流中的每一个流的活动都是真实地并行的,尽管在一个运行系统中,这些流既可以是真实并发的(当系统被部署在多个结点上的情况下),也可以是顺序但交替的(在系统只部署在一个结点上的情况下),因此只给出真实并发的图示。

        一个汇合表示两个或更多的并发控制流的同步。一个汇合可以有两个或多个进入转移和一个离去转移。在这个汇合上面,与每一个路径相关的活动并行地执行。在汇合处,并发的流取得同步,这意味着每个流都等待着,直到所有进入流都到达这个汇合处,然后,在这个汇合的下面,只有一个控制流从这一点继续执行。

 汇合和分岔应该是平衡的,即离开一个分岔的流的数目应该和进入与它对应的汇合的流的数目相匹配。

2.6、泳道

将一个活动图中的活动状态分组,每一组表示负责那些活动的业务机构。每个组被称为一个泳道,因为从视觉上,每组用一条垂直的实线把它与邻居分开

一个泳道说明一组共享某个机构特性的活动,每个泳道在图中都有一个唯一的名称。泳道可能代表现实世界的某些实体。

每个泳道表示一个活动图的全部活动中部分活动的高层职责,并且每个泳道最终可能由一个或多个类实施。在一个被划分为泳道的活动图中,每个活动严格地属于一个泳道,而转移可以跨越泳道。

2.7、对象流

对象可以被包含在与一个活动图相关的控制流中。把这些对象放置在活动图中,并用箭头将它们连接到产生或使用这些对象的活动上。

因为它描述了一个对象值从一个动作流向另一个动作。对象流本质上意味着控制流(没有对象值,就无法执行一个需要该对象值的动作),因而无需在由对象流连接的动作之间再画出控制流。
 

上图中Process order将创建一个Order对象,Ship order将把Order对象的状态变为filled。

显示对象状态是如何改变,通过在对象名下面的方括号中命名它的状态来表示对象的状态。

2.8、扩展区域

扩展区域表示在元素列表或集合上执行的活动模型片断。在活动图中,围绕着一个区域画一条虚线来表示扩展区域。

区域的输入和输出都是值的集合

上图在图的主体中,接收了一个订单。这样就产生了一个类型为Order的值,该值包含了一个类型为LineItem的数组。Order值是向扩展区域的输入。扩展区域的每次执行都作用于 Order 集合中的一个元素。

在区域内部输入值的类型对应于Order 数组的一个元素,即LineItem。

扩展区域活动分岔到两个动作:一个动作找到 Product(产品)并将它加到送货队列;另一个动作计算货物的价格。没有必要按顺序处理 LineItems,扩展区域的不同执行可以并发进行。当扩展区域中所有的执行都结束时,货物被放入 Shipment(Products 的集合),价格也被放入 Bill(Money值的集合)。值Shipment是动作ShipOrder 的输入,而值Bill 是动作SendBill的输入。

3、一般用法

3.1、对工作流建模

建立过程:

        为工作流建立一个焦点。除非很小的系统,否则不可能在一张图中显示所有感兴趣的工作流。

        选择对总体工作流中的各个部分具有高层职责的业务对象。这些业务对象可以是系统词汇中的真实事物,也可能较为抽象。无论哪种情况,为每个重要的业务对象或组织建立一个泳道。

        识别该工作流初始状态的前置条件和该工作流终止状态的后置条件。这对于帮助对工作流的边界建模是重要的。

        从该工作流的初始状态开始,说明随着时间发生的动作,并在活动图中表示它们。
将复杂的动作或多次出现的动作集分解到一个单独活动图中来调用。

        找出连接这些动作和活动结点的流。首先从工作流的顺序流开始,然后考虑分支,接着再考虑分岔和汇合。

        如果工作流中涉及重要的对象,则把它们也加入到活动图中。如果对表达对象流的意图是必要的,则显示其变化的值和状态。

上图显示了一个零售业务的活动图,它所说明的是当一个顾客从邮件订单中返回一个项目时的工作流。工作从顾客对象Customer的动作Request return开始,然后通过Telesales(Get return number),回到 Customer(Ship item),然后到仓库对象Warehouse(先到Receive item,后到Restock item),最后,以会计对象Accounting的Credit account结束。如图20-10所示,一个重要对象(Item的一个实例)也在过程中流动,并且从returned状态变化到available状态。

3.2、对操作建模

建立过程:

        收集这个操作所涉及的抽象。包括操作的参数(及其返回类型,如果有)、所属类的属性以及某些邻近的类。

        识别该操作的初始状态的前置条件和终止状态的后置条件,也要识别操作所属的类在操作执行期间必须保持的不变式。

        从该操作的初始状态开始,说明随着时间发生的活动和动作,并在活动图中将它们表示为活动状态或者动作状态。

        如果需要,使用分支来说明条件路径和迭代。 

        仅当这个操作属于一个主动类时,才在必要时用分岔和汇合来说明并行的控制流。

上图显示了一个在类Line的语境中描述操作intersection的算法的活动图,它的特征标记包含一个参数(line,属于类Line)和一个返回值(属于类Point)。类Line有两个关注的属性:slope(线段斜率)和delta(线段相对原点的偏移量)。

这个操作的算法很简单,如下面的活动图所示。首先,检测当前线段的斜率slope是否和参数line的slope相同。如果相同,线段不交叉,并返回一点Point(0,0)。否则,操作首先计算交叉点的x值,然后计算y值,x和y都是操作的局部对象。最后,返回一个点Point(x,y)。

相关文章:

【UML用户指南】-21-对基本行为建模-活动图

目录 1、概念 2、组成结构 2.1、动作 2.2、活动节点 2.3、控制流 2.4、分支 2.5、分岔和汇合 2.6、泳道 2.7、对象流 2.8、扩展区域 3、一般用法 3.1、对工作流建模 3.2、对操作建模 一个活动图从本质上说是一个流程图,展现从活动到活动的控制流 活动图…...

【web2】jquary,bootstrap,vue

文章目录 1.jquary:选择器1.1 jquery框架引入:$("mydiv") 当成id选择器1.2 jquery版本/对象:$(js对象) -> jquery对象1.3 jquery的页面加载事件:$ 想象成 window.onload 1.4 jquery的基本选择器:$()里内容…...

独角兽品牌獭崎酱酒:高性价比的酱香之选

在酱香型白酒领域中,獭崎酱酒以其独特的品牌定位和高性价比迅速崛起,成为市场上备受关注的独角兽品牌。作为贵州茅台镇的一款新秀酱香酒,獭崎酱酒不仅传承了百年酿造工艺,还以创新的商业模式和亲民的价格赢得了广大消费者的青睐。…...

java打印菱形和空心菱形

java打印菱形 菱形分上下两个部分。其中上部分同打印金字塔;下部分循环部分i是递减 (ps:菱形层数只能为奇数) import java.util.Scanner;public class Lingxing{public static void main(String[] args) {Scanner myScanner new Scanner(S…...

Day10 —— 大数据技术之Scala

Scala编程入门 Scala的概述什么是Scala?Scala的重要特点Scala的使用场景 Scala的安装Scala基础Scala总结 Scala的概述 什么是Scala? Scala是一种将面向对象和函数式编程结合在一起的高级语言,旨在以简洁、优雅和类型安全的方式表达通用编程…...

Linux应用系统快速部署:docker快速部署linux应用程序

目录 一、背景 (一)引入docker的起因 (二)docker介绍 (三)Docker部署的优势 1、轻量级和可移植性 2、快速部署和扩展 3、一致性 4、版本控制 5、安全性 6、资源隔离 7、简化团队协作 8、多容器…...

三目运算符中间的表达式可以省略吗(a?:c)?

熟悉C语言的童靴对三目运算符都非常熟悉,a? b : c; 如果a为true,则整个运算符的值为b,否则为c;那么问题来了,三目运算符中间的表达式可以省略吗?即a? : c; 1、linux内核中出现的省略情况 本人在阅读内核代码是发现了下面的代码: preferr…...

android 彩虹进度条自定义view实现

实现一个彩虹色进度条功能,不说明具体用途大家应该能猜到。想找别人造的轮子,但是没有合适的,所以决定自己实现一个。 相关知识 android 自定义view LinearGradient 线性渐变 实现步骤 自定义view 自定义一个TmcView类继承View 重写两…...

免费一年SSL证书申请——建议收藏

免费一年SSL证书申请——建议收藏 获取免费一年期SSL证书其实挺简单的 准备你的网站: 确保你的网站已经有了域名,而且这个域名已经指向你的服务器。还要检查你的服务器支持HTTPS,也就是443端口要打开,这是HTTPS默认用的。 验证域…...

【docker1】指令,docker-compose,Dockerfile

文章目录 1.pull/image,run/ps(进程),exec/commit2.save/load:docker save 镜像id,不是容器id3.docker-compose:多容器:宿主机(eth0网卡)安装docker会生成一…...

Flutter中的异步和多进程

Flutter 是一个用于创建高性能、高保真度移动应用的框架,它使用 Dart 编程语言。 在 Flutter 中,异步和多进程是两种不同的概念,用于解决不同的问题。 异步 (Asynchronous) 异步编程是一种编程范式,允许代码在等待操作完成(如网络请求、文件 I/O)时继续执行其他任务,而不…...

学习C++第二天

1.缺省参数 缺省参数的概念&#xff1a; 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void show(int a 10) {cout << a << endl; }int main() {sho…...

解析Java中1000个常用类:AbstractSet类,你学会了吗?

推荐一个我自己写的小报童专栏导航网站: http://xbt100.top 收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~复制URL可直达。 以下是正文。 在 Java 集合框架中,AbstractSet 是一个重要的抽象类,为实现自定义的集合(Set)提…...

Nginx基础概念和常用操作

文章目录 1. 安装、启动、连接2. 快速尝试部署网站3. 配置文件1. nginx.conf全局配置事件模块HTTP 模块性能优化建议 2. default.confserver 块基本设置日志设置根路径设置 4. 反向代理1. 模拟3个Web2. 链接 5. 负载均衡1. 加权轮询&#xff0c;Weighted Round Robin2. 最少连接…...

圈复杂度是什么?go语言调整圈复杂度举例

圈复杂度&#xff08;也称为循环复杂度或McCabe复杂度&#xff09;是衡量程序复杂性的一个指标&#xff0c;它通常与代码中的控制流结构&#xff08;如条件语句、循环和函数调用&#xff09;的数量相关。在Go语言中&#xff0c;你可以通过重构代码来降低圈复杂度&#xff0c;从…...

设计模式4-模版方法

设计模式 重构获得模式重构的关键技法1. 静态转动态2. 早绑定转晚绑定3. 继承转组合4. 编译时依赖转运行时依赖5. 紧耦合转松耦合 组件协助动机模式定义结构 要点总结。 例子示例解释&#xff1a; 重构获得模式 设计模式的目的是应对变化&#xff0c;提高复用 设计模式的要点…...

yii2 ActiveForm使用技巧

持续更新&#xff1a; 1、搜索输入框&#xff1a;form-inline <?php $form ActiveForm::begin([action > [index],method > get,options > [class > form-inline] &#xff08;增加此行代码&#xff09; ]); ?>...

【面试】基本数据类型的包装类缓存

目录 1. 说明2. Integer类分析2.1 代码块2.2 字节码2.3 分析2.4 valueOf方法 1. 说明 1.在java中&#xff0c;基本数据类型的包装类&#xff08;Integer、Byte、Character、Short、Long、Boolean&#xff09;的某些值会被缓存。2.以提高性能并减少内存使用。3.这种缓存机制是自…...

6月20日(周四)A股行情总结:A股险守3000点,恒生科技指数跌1.6%

A股三大股指走弱&#xff0c;科创板逆势上扬&#xff0c;半导体板块走强&#xff0c;多股20CM涨停。中芯国际港股涨超1%。恒生科技指数跌超1%。离岸人民币对美元汇率小幅走低&#xff0c;20日盘中最低跌至7.2874&#xff0c;创下2023年11月中旬以来的新低&#xff0c;随后收复部…...

Parallels Desktop 19 for mac破解版安装激活使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...