精华内容
下载资源
问答
  • uml序列图
    2021-06-24 22:31:06

    Visio2013绘制软件UML序列图

    • 绘图形状选择

      1. 图形选择

         2. 子图说明

                自关联消息:自身调用自身的方法。即自我调用的同步消息。

    • 完成图

    • 流程说明

    1. 居民前往社区进行项目预约—选择好项目后预约检验单会上传到区域医疗服务平台—存储好预约检验单后转发到医院—医院收到且存储信息—发送预约结果至社区卫生服务中心;
    2. 居民去预约过的医院并进行身份认证;
    3. 居民挂号;
    4. 居民缴费;
    5. 居民接受检验—医院存储结果并同居民履约情况一起发送到社区中心;
    6. 居民前往社区中心查看检验结果并开取处方。
    • 问题思考

            无

    • 序列图参考

    1. 参考路径:

            百度图片搜索“visio2013画uml序列图”,找到对应图片。

            序列图来源:https://m.book118.com/html/2016/0520/43427998.shtm?code=031yWjGa1J1PhB0qV2Ia1cEJXB1yWjGn

    1. 参考图:

    更多相关内容
  • UML序列图详解

    2021-01-27 11:02:25
    用例(英语:usecase),或译使用案例、用况,是软件工程或系统工程中对系统如何反应外界请求的描述,是一种通过用户的使用场景来获取需求的技术。每个用例提供了一个或多个场景,该场景说明了系统是如何和最终用户...
  • UML序列图

    2021-03-05 02:01:48
    现在是二月,而且到如今你或许已经读到、或听到人们谈论UML2.0——包括若干进步的UML的新规范,所做的变化。考虑到新规范的重要性,我们也正在修改这个文章系列的基础,把我们的注意力从OMG的UML...此外,为了要使变成
  • UML已成为面向对象设计的标准图形化工具,在UML定义的各种图中,...其中UML序列图就是用来描述类与类之间的方法调用过程(或消息发送)是如何实现的。本文通过一个具体的应用程序的设计与实现过程,详细说明了利用UM
  • 图表基于Roslyn的项目,用于生成UML序列图
  • 软件UML序列图绘制01
  • UML 序列图详解

    万次阅读 2018-10-31 09:23:40
    现在是二月,而且到如今你或许已经读到、或听到人们谈论UML...考虑到新规范的重要性,我们也正在修改这个文章系列的基础,把我们的注意力从 OMG 的 UML 1.4 规范,转移到 OMG 的已采纳 UML 2.0草案规范(又名 UML 2...

    原文出自:https://www.cnblogs.com/Alenliu/p/5148391.html

    现在是二月,而且到如今你或许已经读到、或听到人们谈论UML 2.0 —— 包括若干进步的 UML 的新规范,所做的变化。考虑到新规范的重要性,我们也正在修改这个文章系列的基础,把我们的注意力从 OMG 的 UML 1.4 规范,转移到 OMG 的已采纳 UML 2.0草案规范(又名 UML 2)。我不喜欢在一系列文章的中间,把重点从 1.4 变为 2.0 ,但是 UML 2.0 草案规范是前进的重要一步,我感觉需要扩充文字。

    由于一些理由,OMG 改良了 UML 。主要的理由是,他们希望 UML 模型能够表达模型驱动架构(MDA),这意味着 UML 必须支持更多的模型驱动的符号。同时, UML 1.x 符号集合有时难以适用于较大的应用程序。此外,为了要使图变成更容易阅读,需要改良符号元件。(举例来说,UML 1.x 的模型逻辑流程太复杂,有时不可能完成。对UML 2 中的序列图的符号集合的改变,已经在序列化逻辑建模方面取得巨大的进步)。

    注意我上面所述的文字:“已采纳UML2.0草案规范。”确实,规范仍然处于草案状态,但是关键 是草案规范已经被 OMG 采用,OMG是一个直到新标准相当可靠,才会采用它们的组织。 在 UML 2 完全地被采用之前,规范将会有一些修改,但是这些改变应该是极小的。主要的改变将会是在 UML 的内部 —— 包括通常被实施 UML 工具的软件公司使用的功能。

    本文的主要目的是继续把我们的重点放在基础UML图上;这个月,我们进一步了解序列图。再次请注意,下面提供的例子正是以新的 UML 2 规范为基础。

    图的目的 
    序 列图主要用于按照交互发生的一系列顺序,显示对象之间的这些交互。很象类图,开发者一般认为序列图只对他们有意义。然而,一个组织的业务人员会发现,序列 图显示不同的业务对象如何交互,对于交流当前业务如何进行很有用。除记录组织的当前事件外,一个业务级的序列图能被当作一个需求文件使用,为实现一个未来 系统传递需求。在项目的需求阶段,分析师能通过提供一个更加正式层次的表达,把用例带入下一层次。那种情况下,用例常常被细化为一个或者更多的序列图。

    组织的技术人员能发现,序列图在记录一个未来系统的行为应该如何表现中,非常有用。在设计阶段,架构师和开发者能使用图,挖掘出系统对象间的交互,这样充实整个系统设计。

    序列图的主要用途之一,是把用例表达的需求,转化为进一步、更加正式层次的精细表达。用例常常被 细化为一个或者更多的序列图。序列图除了在设计新系统方面的用途外,它们还能用来记录一个存在系统(称它为“遗产”)的对象现在如何交互。当把这个系统移 交给另一个人或组织时,这个文档很有用。

    符号 
    既 然这是我基于 UML 2的 UML 图系列文章的第一篇,我们需要首先讨论对 UML 2 图符号的一个补充,即一个叫做框架的符号元件。在 UML 2中,框架元件用于作为许多其他的图元件的一个基础,但是大多数人第一次接触框架元件的情况,是作为图的图形化边界。当为图提供图形化边界时,一个框架元 件为图的标签提供一致的位置。在 UML 图中框架元件是可选择的;就如你能在图 1 和 2 中见到的,图的标签被放在左上角,在我将调用框架的“namebox”中,一种卷角长方形,而且实际的 UML 图在较大的封闭长方形内部定义。

    图 1: 空的 UML 2 框架元件

    图 1: 空的 UML 2 框架元件

    除了提供一个图形化边框之外,用于图中的框架元件也有描述交互的重要的功能, 例如序列图。在序列图上一个序列接收和发送消息(又称交互),能通过连接消息和框架元件边界,建立模型(如图 2 所见到)。这将会在后面“超越基础”的段落中被更详细地介绍。

    图 2: 一个接收和发送消息的序列图

    图 2: 一个接收和发送消息的序列图

    注意在图 2 中,对于序列图,图的标签由文字“sd”开始。当使用一个框架元件封闭一个图时,图的标签需要按照以下的格式:

    图类型 图名称
    

    UML 规范给图类型提供特定的文本值。(举例来说,sd代表序列图,activity代表活动图,use case代表用例图)。

    基础 
    序 列图的主要目的是定义事件序列,产生一些希望的输出。重点不是消息本身,而是消息产生的顺序;不过,大多数序列图会表示一个系统的对象之间传递的什么消 息,以及它们发生的顺序。图按照水平和垂直的维度传递信息:垂直维度从上而下表示消息/调用发生的时间序列,而且水平维度从左到右表示消息发送到的对象实 例。

    生命线 
    当画一个序列图的时候,放置生命线符号元件,横跨图的顶部。生命线表示序列中,建模的角色或对象实例。 1 生命线画作一个方格,一条虚线从上而下,通过底部边界的中心(图 3)。生命线名字放置在方格里。

    图 3: 用于一个实体名为freshman的生命线的Student类的一个例子

    图 3: 用于一个实体名为freshman的生命线的Student类的一个例子

    UML 的生命线命名标准按照如下格式:

    实体名 : 类名
    

    在如图3所示的例子中,生命线表示类Student的实体,它的实体名称是freshman。这 里注意一点,生命线名称带下划线。当使用下划线时,意味着序列图中的生命线代表一个类的特定实体,不是特定种类的实体(例如,角色)。在将来的一篇文章 中,我们将会了解结构化建模。现在,仅仅评述序列图,可能包含角色(例如买方 和卖方 ),而不需要叙述谁扮演那些角色(例如Bill 和Fred )。这准许不同语境的图重复使用。简单拖放,序列图的实例名称有下划线,而角色名称没有。

    图 3 中我们生命线例子是一个命名的对象,但是不是所有的生命线都代表命名的对象。相反的,一个生命线能用来表现一个匿名的或未命名的实体。当在一个序列图上, 为一个未命名的实例建模时,生命线的名字采用和一个命名实例相同的模式;但是生命线名字的位置留下空白,而不是提供一个例图名字。再次参考图 3,如果生命线正在表现Student类的一个匿名例图,生命线会是: “Student”。同时, 因为序列图在项目设计阶段中使用,有一个未指定的对象是完全合法: 举例来说,“freshman”。

    消息 
    为了可读性,序列图的第一个消息总是从顶端开始,并且一般位于图的左边。然后继发的消息加入图中,稍微比前面的消息低些。

    为了显示一个对象(例如,生命线)传递一个消息给另外一个对象,你画一条线指向接收对象,包括一 个实心箭头(如果是一个同步调用操作)或一个棍形箭头(如果是一个异步讯号)。消息/方法名字放置在带箭头的线上面。正在被传递给接收对象的消息,表示接 收对象的类实现的一个操作/方法。在图 4 的例子中,analyst对象调用ReportingSystem 类的一个实例的系统对象。analyst对象在调用系统对象的 getAvailableReports 方法。系统对象然后调用secSystem 对象上的、包括参数userId的getSecurityClearance 方法,secSystem的类的类型是 SecuritySystem。 2

    图 4: 一个在对象之间传递消息的实例

    图 4: 一个在对象之间传递消息的实例

    除了仅仅显示序列图上的消息调用外,图 4 中的图还包括返回消息。这些返回消息是可选择的;一个返回消息画作一个带开放箭头的虚线,向后指向来源的生命线,在这条虚线上面,你放置操作的返回值。在 图 4 中,当 getSecurityClearance 方法被调用时,secSystem 对象返回 userClearance 给系统对象。当 getAvailableReports 方法被调用时,系统对象返回 availableReports。

    此外,返回消息是序列图的一个可选择部分。返回消息的使用依赖建模的具体/抽象程度。如果需要较好的具体化,返回消息是有用的;否则,主动消息就足够了。我个人喜欢,无论什么时候返回一个值,都包括一个返回消息,因为我发现额外的细节使一个序列图变得更容易阅读。

    当序列图建模时,有时候,一个对象将会需要传递一个消息给它本身。一个对象何时称它本身?一个纯 化论者会争辩一个对象应该永不传递一个消息给它本身。然而,为传递一个消息给它本身的对象建模,在一些情境中可能是有用的。举例来说,图 5 是图 4 的一个改良版本。 图 5 版本显示调用它的 determineAvailableReports 方法的系统对象。通过表示系统传递消息“determineAvailableReports”给它本身,模型把注意力集中到过程的事实上,而不是系统对 象。

    为了要画一个调用本身的对象,如你平时所作的,画一条消息,但是不是连接它到另外的一个对象,而是你把消息连接回对象本身。

    图 5: 系统对象调用它的 determineAvailableReports 方法

    图 5: 系统对象调用它的 determineAvailableReports 方法

    图 5 中的消息实例显示同步消息;然而,在序列图中,你也能为异步消息建模。一个异步消息和一个同步的画法类似,但是消息画的线带一个棍形矛头,如图 6 所示。

    图 6: 表示传递到实体2的异步消息的序列图片段

    图 6: 表示传递到实体2的异步消息的序列图片段

    约束 
    当 为对象的交互建模时,有时候,必须满足一个条件,消息才会传递给对象。约束在 UML 图各处中,用于控制流。在这里,我将会讨论UML 1.x 及UML 2.0两者的约束。在 UML 1.x 中,一个约束只可能被分配到一个单一消息。UML 1.x中,为了在一个序列图上画一个约束,你把约束元件放在约束的消息线上,消息名字之前。图 7 显示序列图的一个片段,消息addStudent 方法上有一个约束。

    图 7:UML 1.x 序列图的一个片段,其中addStudent 消息有一个约束

    图 7:UML 1.x 序列图的一个片段,其中addStudent 消息有一个约束

    在图 7 中,约束是文本“[ pastDueBalance=0]”。通过这个消息上的约束,如果应收帐系统返回一个零点的逾期平衡,addStudent 消息才将会被传递。约束的符号很简单;格式是:

    [Boolean Test]
    

    举例来说,

    [pastDueBalance = 0]
    

    组合碎片(变体方案,选择项,和循环) 
    然 而,在大多数的序列图中,UML 1.x“in-line”约束不足以处理一个建模序列的必需逻辑。这个功能缺失是 UML 1.x 的一个问题。UML 2 已经通过去掉“in-line”约束,增加一个叫做组合碎片的符号元件,解决了这一个问题。一个组合碎片用来把一套消息组合在一起,在一个序列图中显示条 件分支。UML 2 规范指明了组合碎片的 11 种交互类型。十一种中的三种将会在“基础”段落中介绍,另外两种类型将会在“超越基础”中介绍,而那剩余的六种我将会留在另一篇文章中介绍。(嗨,这是一 篇文章而不是一本书。我希望你在一天中看完这部分!)

    变体 
    变体用来指明在两个或更多的消息序列之间的、互斥的选择。 3 变体支持经典的“if then else”逻辑的建模(举例来说,如果 我买三个,然后 我得到 我购买的20% 折扣;否则 我得到我购买的 10% 折扣)。

    就如你将会在图 8 中注意到的,一个变体的组合碎片元件使用框架来画。单词“alt”放置在框架的namebox里。然后较大的长方形分为 UML 2 所称的操作元。 4 操作元被虚线分开。每个操作元有一个约束进行测试,而这个约束被放置在生命线顶端的操作元的左上部。 5 如果操作元的约束等于“true”,然后那个操作元是要执行的操作元。

    图 8:包含变体组合碎片的一个序列图片段

    图 8:包含变体组合碎片的一个序列图片段

    图 8作为一个变体的组合碎片如何阅读的例子,显示序列从顶部开始,即bank对象获取支票金额和帐户结余。此时,序列图中的变体组合碎片接管。因为约束 “[balance >= amount]”,如果余额超过或等于金额,然后顺序进行bank对象传递 addDebitTransaction 和 storePhotoOfCheck 消息给account对象。然而,如果余额不是超过或等于金额,然后顺序的过程就是bank传递addInsuffientFundFee 和 noteReturnedCheck 消息给account对象,returnCheck 消息给它自身。因为“else”约束,当余额不大于或者等于金额时,第二个序列被调用。在变体的组合碎片中,不需要“else”约束;而如果一个操作元, 在它上面没有一个明确的约束,那么将假定“else”约束。

    变体的组合碎片没被限制在简单的“if then else”验证。可能需要大量的变体路径。 如果需要较多的变体方案,你一定要做的全部工作就是把一个操作元加入有序列约束和消息的长方形中。

    选择项 
    选择项组合碎片用来为序列建模,这些序列给予一个特定条件,将会发生的;或者,序列不发生。一个选择项用来为简单的“if then”表达式建模。(例如,如果架上的圈饼少于五个,那么另外做两打圈饼)。

    选择项组合碎片符号与变体组合碎片类似,除了它只有一个操作元并且永不能有“else”约束以外 (它就是如此,没有理由)。要画选择项组合,你画一个框架。文字“opt”是被放置在框架的 namebox 里的文本,在框架的内容区,选择项的约束被放置在生命线顶端上的左上角。 然后选择项的消息序列被放在框架的内容区的其余位置内。这些元件如图 9 所示。

    图 9:包括选择项组合碎片的一个序列图片段

    图 9:包括选择项组合碎片的一个序列图片段

    阅读选择项组合碎片很容易。图 9 是图 7 的序列图片段的再加工,但是这次它使用一个选择项组合碎片,因为如果Student的逾期平衡等于0,需要传递更多的消息。按照图 9 的序列图,如果Student的逾期平衡等于零,然后传递addStudent,getCostOfClass和chargeForClass消息H绻鸖 tudent的逾期平衡不等于零,那么在选择项组合碎片中,序列不传递任何一个消息。

    例子图 9的序列图片段包括一个选择项约束;然而,约束不是一个必需的元件。在高层次、抽象的序列图中,你可能不想叙述选择项的条件。你可能只是想要指出片段是可选择的。

    循环 
    有时候你将会需要为一个重复的序列建模。在 UML 2 中,为一个重复的序列建模已经改良,附加了循环组合碎片。

    循环组合碎片表面非常类似选择项组合碎片。你画一个框架,在框架的 namebox 中放置文本“loop”。在框架的内容区中,一个生命线的顶部,循环约束 6被 放置在左上角。然后循环的消息序列被放在框架内容区的其余部分中。在一个循环中,除了标准的布尔测试外,一个约束能测试二个特定的条件式。特定的约束条件 式是写作“minint = [the number]”(例如,“minint = 1”)的最小循环次数,和写作“maxint = [the number]”(例如,“maxint = 5”)的最大循环次数。通过最小循环检验,循环必须运行至少指定次数,而循环执行次数不能达到约束指定的最大循环次数。

    图 10:循环组合碎片的一个序列图例子

    图 10:循环组合碎片的一个序列图例子 (单击放大)

    在图 10 中显示的循环运行,直到 reportsEnu 对象的 hasAnotherReport 消息返回false。如果循环序列应该运行,这个序列图的循环使用一个布尔测试确认。为了阅读这个图,你和平常一样,从顶部开始。当你到达循环组合碎片, 做一个测试,看看值 hasAnotherReport 是否等于true。如果 hasAnotherReport 值等于true,于是序列进入循环片断。然后你能和正常情况一样,在序列图中跟踪循环的消息。

    超越基础

    我已经介绍了序列图的基础,应该使你可以为将会在系统中通常发生的大部份交互建模。下面段落将会介绍用于序列图的比较高阶的符号元件。

    引用另外一个序列图 
    当做序列图的时候,开发者爱在他们的序列图中,重用存在的序列图。 7 在 UML 2 中开始,引进“交互进行”元件。追加交互进行的可以说是 UML 2 交互建模中的最重要的创新。交互进行增加了功能,把原始的序列图组织成为复杂的序列图。由于这些,你能组合(重用)较简单的序列,生成比较复杂的序列。这 意味你能把完整的、可能比较复杂的序列,抽象为一个单一的概念单位。

    一个交互进行元件使用一个框架绘制。文字“ref”放置在框架的 namebox 中,引用的序列图名字放置在框架的内容区里,连同序列图的任何参数一起。引用序列图的名字符号如下模式:

    序列图名[(参数)] [: 返回值]
    

    两个例子:

    1.  Retrieve Borrower Credit Report(ssn) : borrowerCreditReport

    或者

    2.  Process Credit Card(name, number, expirationDate, amount : 100)

    在例子 1 中,语法调用叫做Retrieve Borrower Credit Report的序列图,传递给它参数 ssn。序列Retreive Borrower Credit Report返回变量 borrowerCreditReport 。

    在实例 2 中,语法调用叫做Process Credit Card的序列图,传递给它参数name,number,expiration date,和 amount。然而,在例子 2 中,amount参数将会是值100。因为例子2没有返回值标签,序列不返回值(假设,建模的序列不需要返回值)。

    图 11: 一个引用两个不同序列图的序列图

    图 11: 一个引用两个不同序列图的序列图

    图 11 显示一个序列图,它引用了序列图“Balance Lookup”和“Debit Account”。序列从左上角开始,客户传递一个消息给teller对象。teller对象传递一个消息给 theirBank 对象。那时,调用Balance Lookup序列图,而 accountNumber作为一个参数传递。Balance Lookup序列图返回balance变量。然后检验选择项组合碎片的约束条件,确认余额大于金额变量。在余额比金额更大的情况下,调用Debit Account序列图,给它传递参数accountNumber 和amount。在那个序列完成后,withdrawCash 消息为客户返回cash。

    重要的是,注意在图 11 中,theirBank 的生命线被交互进行Balance Lookup隐藏了。因为交互进行隐藏生命线,意味着theirBank 生命线在“Balance Lookup”序列图中被引用。除了隐藏交互进行的生命线之外,UML 2 也指明,生命线在它自己的“Balance Lookup”序列中,一定有相同的 theirBank 。

    有时候,你为一个序列图建模,其中交互进行会重叠没有 在交互进行中引用的生命线。在那种情况下,生命线和正常的生命线一样显示,不会被重叠的交互进行隐藏。

    在图 11 中,序列引用“Balance Lookup”序列图。“Balance Lookup”序列图在图 12 中显示。因为例子序列有参数和一个返回值,它的标签 —— 位于图的 namebox 中 —— 按照一个特定模式:

    图类型 图名 [参数类型:参数名]
    
    [: 返回值类型]
    

    两个例子:

    1.  SD Balance Lookup(Integer : accountNumber) : Real

    2.  SD Available Reports(Financial Analyst : analyst) : Reports

    图 12 举例说明例子 1,在里面,Balance Lookup序列把参数 accountNumber 作为序列中的变量使用,序列图显示返回的Real对象。在类似这种情况下,返回的对象采用序列图实体名。

    图 12: 一个使用 accountNumber 参数并返回一个Real对象的序列图

    图 12: 一个使用 accountNumber 参数并返回一个Real对象的序列图

    图 13 举例说明例子 2,在里面,一个序列图获取一个参数,返回一个对象。然而,在图 13 中参数在序列的交互中使用。

    图 13: 一个在它的交互中使用参数、返回一个Reports对象的序列图

    图 13: 一个在它的交互中使用参数、返回一个Reports对象的序列图

    门 
    前 面的段落展示如何通过参数和返回值传递信息,引用另一个序列图。然而,有另一个方法在序列图之间传递消息。门可能是一个容易的方法,为在序列图和它的上下 文之间的传递消息建模。一个门只是一个消息,图形表示为一端连接序列图的框架边缘,另一端连接到生命线。使用门的图 11 和 12 ,在图 14 和 15 中可以被看到重构。图 15 的例图有一个叫做getBalance的入口门,获取参数 accountNumber。因为是箭头的线连接到图的框架,而箭头连接到生命线,所以 getBalance 消息是一个入口门。序列图也有一个出囗门,返回balance变量。出口门同理可知,因为它是一个返回消息,连接从一个生命线到图的框架,箭头连接框架。

    图 14: 图 11 的重构,这次使用门

    图 14: 图 11 的重构,这次使用门

    图 15: 图 12 的重构,这次使用门

    图 15: 图 12 的重构,这次使用门

    组合碎片(跳转和并行) 
    在本文前面“基础”的段落中呈现的,我介绍了“变体”,“选择项”,和“循环”的组合碎片。这些三个组合碎片是大多数人将会使用最多的。然而,有二个其他的组合碎片,大量共享的人将会发现有用——跳转和并行。

    跳转 
    跳 转组合碎片几乎在每个方面都和选择项组合碎片一致,除了两个例外。首先,跳转的框架namebox的文本“break”代替了“option”。其次, 当一个跳转组合碎片的消息运行时,封闭的交互作用的其他消息将不会执行,因为序列打破了封闭的交互。这样,跳转组合碎片非常象 C++ 或 Java 的编程语言中的break关键字。

    图 16: 来自图 8 的序列图片段的重构,片段使用跳转代替变体

    图 16: 来自图 8 的序列图片段的重构,片段使用跳转代替变体

    跳转最常用来做模型异常处理。图 16 是图 8 的重构,但是这次图16使用跳转组合碎片,因为它把balance < amount的情况作为一个异常对待,而不是一个变体流。要阅读图 16,你从序列的左上角开始,向下读。当序列到达返回值“balance”的时候,它检查看看是否余额比金额更少。如果余额不少于金额,被传递的下一个消 息是 addDebitTransaction 消息,而且序列正常继续。然而,在余额比金额更少的情况下,然后序列进入跳转组合碎片,它的消息被传递。一旦跳转组合的消息的已经被传递,序列不发送任何 其它消息就退出(举例来说,addDebitTransaction)。

    注意有关跳转的一件重要的事是,它们只引起一个封闭交互的序列退出,不必完成图中描述的序列。在这种情况下,跳转组合是变体或者循环的一部分,然后只是变体或循环被退出。

    并行 
    今天的现代计算机系统在复杂性和有时执行并发任务方面不断进步。当完成一个复杂任务需要的处理时间比希望的长的时候,一些系统采用并行处理进程的各部分。当创造一个序列图,显示并行处理活动的时候,需要使用并行组合碎片元件。

    并行组合碎片使用一个框架来画,你把文本“par”放在框架的 namebox 中。然后你把框架的内容段用虚线分为水平操作元。框架的每个操作元表示一个在并行运行的线程。

    图 17: oven 是并行做两个任务的对象实例

    图 17: oven 是并行做两个任务的对象实例

    图 17 可能没有举例说明做并行活动的对象的最好的计算机系统实例,不过提供了一个容易理解的并行活动序列的例子。序列如这样进行:hungryPerson 传递 cookFood 消息给oven 对象。当oven 对象接收那个消息时,它同时发送两个消息(nukeFood 和 rotateFood)给它本身。这些消息都处理后,hungryPerson 对象从oven 对象返回 yummyFood 。

    总结 
    序列图是一个用来记录系统需求,和整理系统设计的好图。序列图是如此好用的理由是,因为它按照交互发生的时间顺序,显示了系统中对象间的交互逻辑。

    参考

    • UML 2.0 Superstructure Final Adopted Specification (第8章部分) http://www.omg.org/cgi-bin/doc?ptc/2003-08-02
    • UML 2 Sequence Diagram Overview http://www.agilemodeling.com/artifacts/sequenceDiagram.htm
    • UML 2 Tutorial http://www.omg.org/news/meetings/workshops/UML%202003%20Manual/Tutorial7-Hogg.pdf

    脚注 
    1 在完全建模系统中,对象(类的实例)也将会在系统的类图中建模。

    2 当阅读这个序列图时,假定分析师登录进入系统之内。

    3 请注意,附着在不同的变体操作元上的、两个或更多的约束条件式的确可能同时是真,但是实际最多只有一个操作元将会在运行时发生(那种情况下变体的“wins”没有按照 UML 标准定义)。

    4 虽然操作元看起来非常象公路上的小路,但是我特别不叫它们小路。泳道是在活动图上使用的 UML 符号。请参考The Rational Edge 早期关于 活动图的文章。

    5 通常,附上约束的生命线是拥有包含在约束表达式中的变量的生命线。

    6 关于选择项组合碎片,循环组合碎片不需要在它上放置一个约束条件。

    7 可能重用任何类型的序列图(举例来说,程序或业务)。我只是发现开发者更喜欢按功能分解他们的图。

    展开全文
  • 其中UML序列图就是用来描述类与类之间的方法调用过程(或消息发送)是如何实现的。本文通过一个具体的应用程序的设计与实现过程,详细说明了利用UML序列图设计Java应用程序,使得开发过程标准化、可视化,代码编程...
  • UML 序列图 UML 序列图

    2010-06-11 22:47:46
    UML 序列图 UML 序列图 UML 序列图
  • registered:SoftwareArchitectforWebSphere:registered:Software、IBM:registered:Rational:registered:SoftwareArchitectStandardEdition,以及IBM:registered:Rational:registered:SoftwareModeler对序列图编辑器...
  • 提出了一种基于UML序列图的面向对象类簇级测试的方法。这种方法根据序列图进行分析提取类交互信息和用户的输入数据生成测试用例,并根据序列图对代码进行插桩,构造测试模块;最后测试驱动器执行测试模块得到测试...
  • 居民就医预约查询流程
  • 以太坊交易到UML序列图生成器 以太坊交易的序列图生成器。 以下示例交易是从5,100美元硬币(USDC)到5,096美元系绳(USDT)的掉期交易。 tx2uml 0xb2b0e7b286e83255928f81713ff416e6b8d0854706366b6a9ace46a88095...
  • 本文针对UML半形式化的特点,在采用指称语义学方法对序列图进行形式规范的基础上,采用了可扩展的标记语言XML文档格式对UML序列图进行存储,并给出了UML序列图语义处理的算法,实现了对序列图的语义分析.
  • JS序列图描述这是一个基于Web的小型编辑器,用于创建UML序列图,您可以在其中创建图的原型并脱机查看它们,并与下划线文字并排查看。 这个想法和一些代码来自项目的页面。设置下载打开index.html 玩得开心!学分是一...
  • scriptseqchart 从类似的描述脚本生成UML序列图,但免费
  • 用visio画UML序列图

    千次阅读 2019-05-09 15:57:00
    今天尝试使用visio画了一个序列图。 话不多说,先打开visio,新建一个UML序列。 先新建几个对象生命线 加入几个激活 而后是消息,实线表示请求,虚线表示响应。   当然如果不影响...

    今天尝试使用visio画了一个序列图。

    话不多说,先打开visio,新建一个UML序列。

    4b50bea38a9b6f205f2cdff941f4c021455.jpg

    先新建几个对象生命线

    e545a3522ac673b7a96c3400187317944f2.jpg

    加入几个激活

    2fcfb3b83dbbfc1d7a952e247a5a39ce6f8.jpg

    而后是消息,实线表示请求,虚线表示响应。

     

    6a74fce2624fbea874d427595ff321b7c64.jpg

    当然如果不影响理解,可以不用每个请求都配上一个响应。

    此UML例子是在《UML精粹:标准对象建模语言简明指南》中拿过来的,为了更好的理解这个UML,下面使用java来实现此UML。

    ps,源码上传到码云了。https://gitee.com/xixiw777/sequenceDiagramhttps://gitee.com/xixiw777/sequenceDiagram

    • procuct
    package com.simon.uml.sequenceDiagram;
    
    /**
     * Created by IntelliJ IDEA.
     *
     * @author: Simon
     * @date: 2019-05-09
     * @time: 14:50
     * @description:产品
     */
    public class Product {
        private String name;
        private double price;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public double getPrice() {
            return price;
        }
    
        public double getPrice(int number) {
            double orderLinePrice = price * number;
            System.out.println("product name:" + getName()
                    + "\tprice:" + getPrice()
                    + "\tnumber:" + number
                    + "\torder line price:" + orderLinePrice
            );
            return orderLinePrice;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    }
    
    • customer
    package com.simon.uml.sequenceDiagram;
    
    /**
     * Created by IntelliJ IDEA.
     *
     * @author: Simon
     * @date: 2019-05-09
     * @time: 14:51
     * @description:客户
     */
    public class Customer {
        private double discount;
    
        public double getDiscountedValue(Order order) {
            return discount * order.getBaseValue();
        }
    
        public double getDiscount() {
            return discount;
        }
    
        public void setDiscount(double discount) {
            this.discount = discount;
        }
    }
    
    • order
    package com.simon.uml.sequenceDiagram;
    
    import java.util.List;
    
    /**
     * Created by IntelliJ IDEA.
     *
     * @author: Simon
     * @date: 2019-05-09
     * @time: 14:50
     * @description:订单
     */
    public class Order {
        private double baseValue;
        private Customer customer;
        private List<OrderLine> orderLineList;
    
        public double calculatePrice() {
            double sumOrderLinePrice = 0;
            for (OrderLine orderLine : orderLineList) {
                double orderLinePrice = orderLine.calculatePrice();
                sumOrderLinePrice += orderLinePrice;
            }
            this.setBaseValue(sumOrderLinePrice);
            System.out.println("order base price:" + sumOrderLinePrice);
            double discountedValue = getCustomer().getDiscountedValue(this);
            System.out.println("order discounted price:" + discountedValue);
            return discountedValue;
        }
    
        public double getBaseValue() {
            return baseValue;
        }
    
        public void setBaseValue(double baseValue) {
            this.baseValue = baseValue;
        }
    
        public List<OrderLine> getOrderLineList() {
            return orderLineList;
        }
    
        public void setOrderLineList(List<OrderLine> orderLineList) {
            this.orderLineList = orderLineList;
        }
    
        public Customer getCustomer() {
            return customer;
        }
    
        public void setCustomer(Customer customer) {
            this.customer = customer;
        }
    }
    

    order line

    package com.simon.uml.sequenceDiagram;
    
    /**
     * Created by IntelliJ IDEA.
     *
     * @author: Simon
     * @date: 2019-05-09
     * @time: 14:50
     * @description:订单明细
     */
    public class OrderLine {
        private int number;
        private Product product;
    
        public OrderLine(int number, Product product) {
            this.number = number;
            this.product = product;
        }
    
        public double calculatePrice() {
            return product.getPrice(number);
        }
    
    
        public int getNumber() {
            return number;
        }
    
        public void setNumber(int number) {
            this.number = number;
        }
    
        public Product getProduct() {
            return product;
        }
    
        public void setProduct(Product product) {
            this.product = product;
        }
    }
    

     

    • order的测试用例

    package com.simon.uml.sequenceDiagram;
    
    import org.junit.Assert;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    /**
     * Created by IntelliJ IDEA.
     *
     * @author: Simon
     * @date: 2019-05-09
     * @time: 15:23
     * @description:
     */
    public class OrderTest {
    
        @org.junit.Test
        public void calculatePrice() {
            //这个商品是鞋子,123块钱一双
            Product productShoes = new Product();
            productShoes.setName("shoes");
            productShoes.setPrice(123);
            //这个商品是袜子,8块钱一双
            Product productSocket = new Product();
            productSocket.setName("socket");
            productSocket.setPrice(8);
            //这是一个老客户,打七折
            Customer customer = new Customer();
            customer.setDiscount(0.7);
            //这个客户下了一个单
            Order order = new Order();
            order.setCustomer(customer);
            //买了一双鞋子,两双袜子
            OrderLine orderLineShoes = new OrderLine(1, productShoes);
            OrderLine orderLineSocket = new OrderLine(2, productSocket);
            List<OrderLine> orderLineList = new ArrayList<OrderLine>();
            orderLineList.add(orderLineShoes);
            orderLineList.add(orderLineSocket);
            order.setOrderLineList(orderLineList);
            //算一算总共多少钱
            double priceActual = order.calculatePrice();
            Assert.assertEquals("97.3", String.valueOf(priceActual));
        }
    }
    • 测试用例的输出

    product name:shoes     price:123.0    number:1    order line price:123.0
    product name:socket    price:8.0        number:2    order line price:16.0
    order base price:139.0
    order discounted price:97.3

    转载于:https://my.oschina.net/u/3301706/blog/3047521

    展开全文
  • UML序列图 - 示例总汇

    万次阅读 2019-03-26 14:04:36
    序列图是时间焦点,它们通过使用图表的垂直轴来直观地显示交互的顺序,以表示消息的发送时间和时间。 序列图捕获: 在实现用例或操作的协作中发生的交互(实例图或通用图) 系统用户与系统之间,系统与其他系统...

    UML Sequence Diagrams是交互图,详细说明了如何执行操作。它们捕获协作环境中对象之间的交互。序列图是时间焦点,它们通过使用图表的垂直轴来直观地显示交互的顺序,以表示消息的发送时间和时间。

    UML图层次结构中的序列图

    序列图捕获:

    • 在实现用例或操作的协作中发生的交互(实例图或通用图)
    • 系统用户与系统之间,系统与其他系统之间或子系统之间的高级交互(有时称为系统序列图)

    学习UML更快,更好,更容易

    您是否正在寻找一种免费的UML工具来更快,更轻松,更快速地学习UML?Visual Paradigm Community Edition是一个支持所有UML图类型的UML软件。它是一款屡获殊荣的国际UML建模师,但它易于使用,直观且完全免费。

    免费下载

    序列图的目的

    • 模拟系统中活动对象之间的高级交互
    • 对实现用例的协作中的对象实例之间的交互建模
    • 对实现操作的协作中的对象之间的交互建模
    • 模拟通用交互(显示通过交互的所有可能路径)或交互的特定实例(仅显示交互中的一条路径)

    序列图一览

    序列图显示元素随着时间的推移而相互作用,它们根据对象(水平)和时间(垂直)组织:

    对象维度

    • 横轴表示交互中涉及的元素
    • 传统上,操作中涉及的对象根据它们何时参与消息序列从左到右列出。但是,横轴上的元素可以按任何顺序出现

    时间维度

    • 纵轴表示页面下的时间进程(或进展)。

    注意:

    序列图中的时间都是关于排序的,而不是持续时间。交互图中的垂直空间与交互持续时间无关。

    序列图示例:酒店系统

    序列图是一个交互图,详细说明了如何执行操作 - 发送什么消息以及何时发送消息。序列图根据时间进行组织。当你走下页面时,时间会进行。操作中涉及的对象根据它们何时参与消息序列从左到右列出。

    以下是进行酒店预订的序列图。启动消息序列的对象是预留窗口。

    序列图示例

    注意:类和对象图是静态模型视图。交互图是动态的。它们描述了对象如何协作。

    序列图表示法

    符号说明

    视觉表现

    参与者

    • 与主体交互的实体所扮演的一种角色(例如,通过交换信号和数据)
    • 在主体外部(即,在某个意义上,参与者的实例不是其相应主题的实例的一部分)。
    • 表示人类用户,外部硬件或其他主题所扮演的角色。

    注意:

    • 参与者不一定代表特定的物理实体,而仅仅代表某个实体的特定角色
    • 一个人可以扮演几个不同参与者的角色,相反,一个参与者可以由多个不同的人演奏。

    演员

    生命线

    • 生命线代表交互中的个体参与者。

    生命线

    激活

    • 生命线上的细长矩形表示元素执行操作的时间段。
    • 矩形的顶部和底部分别与启动和完成时间对齐

    激活

    来电留言

    • 消息定义了交互的生命线之间的特定通信。
    • 呼叫消息是一种表示目标生命线操作调用的消息。

    来电留言

    返回消息

    • 消息定义了交互的生命线之间的特定通信。
    • 返回消息是一种消息,表示将信息传递回相应的前消息的调用者。

    返回消息

    自我消息

    • 消息定义了交互的生命线之间的特定通信。
    • 自我消息是一种表示同一生命线的消息调用的消息。

    自消息

    递归消息

    • 消息定义了交互的生命线之间的特定通信。
    • 递归消息是一种表示同一生命线的消息调用的消息。它的目标指向在调用消息的激活之上进行激活。

    递归消息

    创建消息

    • 消息定义了交互的生命线之间的特定通信。
    • 创建消息是一种表示(目标)生命线实例化的消息。

    创建消息

    消灭消息

    • 消息定义了交互的生命线之间的特定通信。
    • 销毁消息是一种消息,表示破坏目标生命线生命周期的请求。

    消灭消息

    持续时间消息

    • 消息定义了交互的生命线之间的特定通信。
    • 持续时间消息显示消息调用的两个时间点之间的距离。

    持续时间消息

    注意

    注释(注释)使得能够将各种备注附加到元素。注释不带语义力,但可能包含对建模者有用的信息。

    注意

    消息和控制焦点

    • 事件是发生事情的交互中的任何一点。
    • 控制重点:也称为执行发生,执行发生
    • 它在生命线上显示为高而薄的矩形)
    • 它表示元素执行操作的时间段。矩形的顶部和底部分别与启动和完成时间对齐。

    消息和控制焦点

    序列片段

    • UML 2.0引入了序列(或交互)片段。序列片段可以更轻松地创建和维护准确的序列图
    • 序列片段表示为一个框,称为组合片段,它包含序列图中的一部分相互作用
    • 片段运算符(在左上角的短号)表示片段的类型
    • 片段类型:ref,assert,loop,break,alt,opt,neg

    分段

    操作符号

    片段类型

    ALT

    备用多个片段:只执行条件为真的片段。

    选择

    可选:仅当提供的条件为真时才执行片段。相当于只有一条迹线的alt。

    平价

    并行:每个片段并行运行。

    循环:片段可以执行多次,并且防护指示迭代的基础。

    区域

    关键区域:片段只能有一个线程一次执行它。

    NEG

    否定:片段显示无效的交互。

    REF

    参考:指在另一个图上定义的交互。绘制框架以覆盖交互中涉及的生命线。您可以定义参数和返回值。

    SD

    序列图:用于包围整个序列图。

    注意:

    • 可以组合帧以捕获例如循环或分支。
    • 组合片段关键字:alt,opt,break,par,seq,strict,neg,critical,ignore,consideration,assert和loop。
    • 约束通常用于显示消息的时序约束。它们可以应用于一条消息的时间或消息之间的间隔。

    组合片段示例

    组合片段示例

    用例场景建模的序列图

    用户需求被捕获为精简为方案的用例。用例是外部参与者与系统之间交互的集合。在UML中,用例是:

    “系统(或实体)可以执行的一系列动作(包括变体)的规范,与系统的参与者进行交互。”

    场景是通过用例的一个路径或流程,该用例描述在系统的一个特定执行期间发生的事件序列,其通常由序列图表示。

    用例的序列图

    序列图 - 代码前的模型

    序列图可能有点接近代码级别,那么为什么不编码该算法而不是将其绘制为序列图?

    • 一个好的序列图仍然比实际代码的水平高一点
    • 序列图是语言中立的
    • 非编码人员可以做序列图
    • 作为一个团队,更容易做序列图
    • 可用于测试和/或UX线框图

    寻找一个好的和免费的UML工具来创建序列图?

    Visual Paradigm Online 是你的选择,它提供:

    免费序列图示例和模板可在在线序列图软件中编辑:Visual Paradigm Online。使用模板作为起点来创建自己的序列图。

    对象创建和删除

    时间限制(医院病床分配)

    预订座位

    简单的ATM

    银行报价

    下订单

    循环片段

    替代组合片段

    打破沟通片段

    LoopAndBreakSyntax

    Using MVC Stereotypes with Conditional Statement

    Selection and Loops in a Combination

    Make a Phone Call

    Appointment

    Buy Tickets

    MVC Framework

    Hotel Reservation


    要获得完整的UML建模功能,您可以免费使用Visual Paradight Community Edition,也可以在商业版中使用更高级的建模功能。

     

    获取Visual Paradigm Community Edition,一个免费的UML建模工具,并使用免费的序列图工具创建自己的序列图。它易于使用且直观。

    免费下载

    相关链接

     

    1. 什么是统一建模语言?
    2. 专业的UML图工具
    展开全文
  • VSCode序列图vscode序列图如何当您在Visual Studio Code中打开.seqdiag文件时,“预览”选项卡将自动打开。 如果要重新打开预览选项卡,请按CTRL+SHIFT+P或F1打开“命令面板”并执行“ Show Sequence Diagram ...
  • UML 序列图简介 为用例逻辑建模 Scott W. Ambler 总裁Ronin International 2001 年 1 月 11 日 本文来自 /developerworks/cn 序列图用于为使用方案的逻辑建模使用方案恰如其名称所揭示的那样 -- 描述使用系统的潜在...
  • 序列图 - 由提供 鲁棒性图 - 由提供 流程图 - 由.js 提供支持 有关语法的帮助信息,请参阅这些渲染器的网站。 流程图的局限性 图表是静态生成的。 任何交互功能(即节点链接)都将丢失。 不支持自定义样式。 这些...
  • UML序列图——时序图基本使用

    万次阅读 多人点赞 2017-07-19 20:48:56
    一个简单例子简介序列图主要用来更直观的表现各个对象交互的时间顺序,将体现的重点放在 以时间为参照,各个对象发送、接收消息,处理消息,返回消息的 时间流程顺序,也称为时序图。基本元素角色系统角色,可以是人...
  • UML序列图的操作语义及其在模型精化中的一致性检查,赵也非,杨宗源,给UML赋予形式化的动态语义,就可以在需求、设计早期,对关键系统属性进行自动验证,进而保证软件质量,对软件开发设计起到指导作

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,182
精华内容 26,872
关键字:

uml序列图

友情链接: DirectSound.zip