【UML】第14篇 协作图

目录

一、协作图的概述

二、协作图的主要构成

2.1 对象

2.2 消息

 2.3 链

三、协作图如何画

3.1 思路

3.2 步骤


这个系列暂停了好几天了,适当时候再恢复一下。

UML非常经典,只要在这个行业,代码可能不会写一辈子,但是图肯定是画一辈子。其实,随着行业的成熟,一直写代码也将成为常态。GOOGLE的创始人为了AIGC大模型,也出来写代码了,4800亿身家,斯坦福大牛。这个年纪,应该是代码质量最高、思维最成熟度的时候。性价比也最高,因为工资已经不能再涨了。说程序员是青春饭的,只是当年为了跟资本家多要点工资罢了,青春大好的朋友们,别被忽悠了,持续的学习呀!一朝爱上代码,一生离不开BUG。

一、协作图的概述

协作图的定义:

协作图(Collaboration Diagram),用于显示对象之间的交互,强调对象之间的结构关系以及它们之间发送和接收的消息。协作图通常用于表示系统中的操作或方法的执行过程,并显示在执行这些操作时对象是如何相互合作的。

有一个简单易懂的说法:协作图是序列图的另外一种表示交互的方法,但它不强调时间和序列,协作图的主要用途是描述类的一个操作的实现,用于描述对象之间的简单交互。

应用场景介绍:

协作图在软件工程中非常有用,尤其是在分析和设计阶段。以下是协作图的一些应用场景:

  1. 理解对象交互:协作图帮助开发人员理解系统中不同对象之间的交互方式,包括它们如何协作以完成特定任务。
  2. 设计系统行为:在系统设计阶段,协作图可以帮助定义系统的动态行为,展示对象之间的消息传递和方法调用。
  3. 检测潜在问题:通过分析协作图,开发人员可以在早期阶段发现可能的设计问题,如对象之间的不恰当交互或不必要的依赖。
  4. 文档和沟通:协作图可以用作项目文档的一部分,帮助团队成员之间沟通系统的结构和行为。

例子:

假设我们有一个简单的银行系统,其中包括Customer(客户)、Account(账户)和ATM(自动取款机)三个对象。客户想要在ATM机上取款。这个场景的协作图可能包括以下几个部分:

  1. 对象CustomerAccountATM分别作为协作图中的三个对象。
  2. 链接:表示对象之间的关系。例如,CustomerAccount之间可能有一个“持有”关系,而ATMAccount之间可能有一个“访问”关系。
  3. 消息:描述对象之间的交互。例如:
    • CustomerATM发送一个“插入卡”的消息。
    • ATM验证卡片后,向Account发送一个“检查余额”的消息。
    • Account响应“检查余额”的消息,并向ATM返回当前余额。
    • CustomerATM发送一个“取款”的消息,指定金额。
    • ATMAccount发送一个“扣款”的消息。
    • 如果账户余额足够,Account处理扣款并向ATM确认;否则,它发送一个错误消息。
    • ATM根据Account的响应向Customer提供现金或显示错误消息。
  4. 序列号:表示消息的顺序。

通过这个协作图,开发人员可以清晰地看到在取款过程中涉及的对象、它们的交互以及这些交互的顺序。这有助于确保系统的正确实现和理解。

二、协作图的主要构成

2.1 对象

和序列图中,对象的表示、命名,都是一样的。

有3种表示方法:

  • “对象名:所属类名”(下划线)
  • “对象名”(下划线)
  • “:所属类名”(下划线)

下划线是重要的特色,以表示其是类的一个实例。

2.2 消息

协作图中的消息由三个基本部分构成:发送者、接收者和消息名称。

消息由带消息名称标签的箭头表示。它附着在对象之间的链上。箭头方向指向消息的接收者。

一个消息也可以发送给对象自己,即消息的发送者和接收者都是对象自己。

每个消息都有一个序号,用以表明消息的发送顺序。

消息也有自己的名称,即操作的名称,也可以附带参数,即操作的参数。

在协作图中,消息可以表示以下几种类型的交互:

  1. 同步消息:发送对象发送消息后,会等待接收对象处理完毕并返回结果后才能继续执行。同步消息通常用于表示方法调用或函数调用,其中发送对象需要接收对象的返回值来继续其操作。

  2. 异步消息:发送对象发送消息后,不会等待接收对象的响应,而是继续执行其他操作。异步消息用于表示并发或并行的交互,其中发送对象不需要等待接收对象的处理结果。

  3. 返回消息:返回消息是接收对象对发送对象的响应。它表示接收对象已经处理完发送对象的请求,并将结果返回给发送对象。返回消息通常由接收对象发送回发送对象,并使用虚线箭头表示。

在协作图中,消息的传递顺序可以通过序列号或时间顺序来表示。序列号可以帮助理解对象之间的交互顺序和依赖关系。

消息可以复用序列图中消息的类型和画法,想参考的,可以访问我之前的文章:

我们之前讨论了,消息一共有7种,实际中,上面3种是最常用的。

【UML】第12篇 序列图(1/2)——基本概念和构成-CSDN博客

【UML】第13篇 序列图(2/2)——建模的方法-CSDN博客

 2.3 链

链是对象之间的连接,也是类关联的一个实例。在协作图中,链使用实线或弧来连接两个对象。

链也可以位于一个对象跟自己的连接,链的起点和终点在一个对象上。

例如上面例子中,2个对象之前,持有、访问等关系。这个比较灵活,就是一种对象关系的描述。

三、协作图如何画

协作图比较灵活,和序列图一样,就是描述一个交互的场景的实现。但是序列图有标准的布局,画法,由事件的时间轴去驱动,是我们最基本的思路和画法。

但是在协作图,由于我们忽略了时间的顺序,更多是对交互的网络,交互的可能性,建模。因此对象的布局,10个人能画出10个效果来。

3.1 思路

  • 设置交互的语境;
  • 设置交互的场景;
  • 对每个对象设置初始特性;
  • 描述对象之间可能有信息沿着它传递的链;
  • 设置消息的顺序号。

由于我们没有序列的概念,序号是很重要的手段。

3.2 步骤

  • 确定用例中的交互过程——要描述哪个交互;
  • 识别参与交互过程的对象——有哪些对象参与到交互中来;
  • 如果需要,为每个对象设置初始特性——这些初始值对对象间的交互是否有影响,有的话可以添加,否则所有对象都有类似的行为;
  • 确定对象之间的链, 及沿着链的消息——对象之间有消息传送,就可以确定一个链;
  • 从引发该交互过程的初始消息开始,将每个消息附到相应的链;
  • 可以使用特别技巧设置消息的循环发送、时间约束等;
  • 如果需要,可以为每个消息设置前置条件和后置条件。

先确定链的方式,这样可以从更高层面上,将对象之间的关系,进行描述。

例图,很多,可以到网上看看。

 

序列图可以转换为协作图,一些软件支持这样的操作,比如经典的ROSE。

(关注我,更多实用内容。) 

        

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

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

相关文章

Java socket编程学习笔记

一、初步了解 1、简易代码(存在socket提前关闭问题) 服务端代码: import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets;public class MySocketServer {public static void main(String[] args) throws IOEx…

js判断是否为数字的方法

找到一个比较好用的方法,记录下来,方便以后使用查找 function isNumber(value) {return !isNaN(parseFloat(value)) && isFinite(value); }目前测试情况: isNumber(123) —> true isNumber(12.3) —> true isNumber(-12.3) —…

阿里2面:万亿级消息,如何做存储设计?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格,小伙伴在面阿里时,遇到了一个存储设计相关的面试题: 存储架构,…

Ubuntu 虚拟机挂接 Windows 目录

Windows 共享目录 首先 Windows 下共享目录 我这里偷懒直接直接 Everyone ,也可以指定用户啥的 Ubuntu 挂接 挂接命令,类似如下: sudo mount -o usernamefananchong,passwordxxxx,uid1000,gid1000,file_mode0644,dir_mode0755,dynperm //…

leetcode09-机器人能否返回原点

题目链接: https://leetcode.cn/problems/robot-return-to-origin/?envTypestudy-plan-v2&envIdprogramming-skills 思路: 循环遍历,模拟即可 代码: class Solution {public boolean judgeCircle(String moves) {int n m…

5.云原生安全之kubesphere应用网关配置域名TLS证书

文章目录 cloudflare配置使用cloudflare托管域名获取cloudflare API Token在cloudflare中配置SSL/TLS kubesphere使用cert-manager申请cloudflare证书安装证书管理器创建Secret资源创建cluster-issuer.yaml创建cert.yaml申请证书已经查看申请状态 部署harbor并配置ingress使用证…

C++中的面向对象重点总结

面向对象的三大特性 封装 封装是将数据和操作这些数据的函数(方法)组合在一个类中的过程。 封装的主要目的是隐藏类的内部实现细节,仅暴露必要的接口给外部,通过控制类成员的访问级别,可以限制对类内部数据的直接访…

【面试】Redis基础知识

题目 为什么Redis是单线程却性能很高? Redis是一个高性能的基于内存的键值存储系统。它之所以能够达到高性能,主要有以下几个原因: 基于内存:Redis将数据存储在内存中,而不是硬盘上,这使得数据的读写速度…

回首2023,期待2024!

2023,在改变中到来 2023年1月1日,我从成都冷清的学校回到了哈尔滨的老家,开始了保研之前的最后一个寒假 当时的目标是将之前的科研理论转化为实际,生产出一篇sci,助力保研加分 星移斗转,事与愿违&#x…

编译ZLMediaKit(win10+msvc2019_x64)

前言 因工作需要,需要ZLMediaKit,为方便抓包分析,最好在windows系统上测试,但使用自己编译的第三方库一直出问题,无法编译通过。本文档记录下win10上的编译过程,供有需要的小伙伴使用 一、需要安装的软件…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)子线程 WorkerThread的实现 和 线程池ThreadPool的初始化

一、子线程 WorkerThread的实现 (1)工作线程 线程ID:每个线程都有一个唯一的ID,用于标识线程的名字:非必需,主要用于识别线程互斥锁:线程同步条件变量:线程阻塞EventLoop:在每个子…

实战环境搭建-linux下安装jdk1.8

查看安装jdk版本信息,主要是怕之前有遗漏的,或者安装失败的java rpm -qa | grep java 显示如下信息: 卸载: rpm -e --nodeps java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 还有一些其他的命令…

工智能基础知识总结--什么是TextCNN

什么是TextCNN Yoon Kim在论文(2014 EMNLP) Convolutional Neural Networks for Sentence Classification提出TextCNN,该模型将卷积神经网络CNN应用到文本分类任务,是卷积神经网络应用到文本分析的开创性工作之⼀。 TextCNN的结构 TextCNN的结构图如下&…

【动态规划】【滑动窗口】C++算法:100154 执行操作后的最大分割数量

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 C算法:滑动窗口总结 动态规划 LeetCode100154 执行操作后的最大分割数量 给你一个下标从 0 开始的字符串 s 和一个整数 k。 你需要执行以下分割操作,直到字符串 s 变为 空&#xf…

分布式事务完美解决方案:消息中间件(kafka)+ 本地事物 + 消息校对

前言 分布式事务是要保证多个服务下的多个数据库操作的一致性。分布式事务常见解决方案有:二阶段、三阶段和TCC实现强一致性事务,其实还有一种广为人知的方案就是利用消息队列来实现分布式事务,保证数据的最终一致性,也就是我们常…

JVM是如何基于虚拟机栈运行的

众所周知:JVM执行Java代码是靠执行引擎实现的。执行引擎有两套解释器:字节码解释器、模板解释器。字节码解释器比较简单,不多说,看图。本篇文章咱们讨论模板解释器执行Java代码的底层原理。 早些年研究模板解释器看到R大用汇编写的…

【Redis】非关系型数据库之Redis的介绍及安装配置

目录 前言 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.3两者的区别 1.4非关系型数据库产生的背景 1.5总结 二、Redis介绍 2.1Redis是什么 2.2Redis的优点 2.3Redis的使用场景 2.4那些数据适合放在缓存中 2.5Redis为什么那么快&#xf…

03-搜索与图论python

1-DFS 排列数字 N10 path[0]*N state[False]*N def dfs(u):if un:for i in range(n):print(path[i],end )print()for i in range(n):if state[i]False:path[u]i1 state[i]Truedfs(u1)#恢复现场path[u]0state[i]False nint(input()) dfs(0)采用位运算太优雅了,细细…

java基础-给个一键三联呗^_^哈哈

文章目录 1.注释修改注释字体三种注释方式 2.标识符和关键字3.数据类型4.类型转换5. 变量、常量、作用域6.基本运算符7.自增自减运算符、初识Math类8.逻辑运算符、位运算符9.三元运算符及小结10.包机制11.JavaDoc生成文档 1.注释 修改注释字体 打开设置Settings 三种注释方…

[Vulnhub靶机] DriftingBlues: 4

[Vulnhub靶机] DriftingBlues: 4靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/driftingblues/driftingblues4_vh.ova 靶机地址:192.168.67.23 攻击机地址:192.168.67.3 一、信息收集 …