软件工程 - 第8章 面向对象建模 - 3 - 动态建模

状态图

  • 状态是指在对象生命周期中满足某些条件、执行某些活动或等待某些事件的一个条件和状况 。

案例一:描述烧水器在工作时的详细行为细节

"人就是一个类,而你"、我"、张三"等都是"人这个类的一个实例,站着"、"躺着等都是对象的一个状态。

  • 状态机图描述从一种状态迁移到另一种状态的控制流程,常用来对系统的动态特征进行建模。在大多数情况下,它用来对反应型对象(外部事件触发对象,对象接收到事件后产生响应)的行为建模
  • 一个状态图包含的元素有初始状态、终止状态、状态、迁移

状态机图的基本符号

  • 一个状态是由状态名、状态变量和活动3部分组成。活动部分列出了处于该状态时要执行的事件和动作。可以用3个标准事件:entry(进入动作) exit(退出动作) do(处于该状态中执行的动作)。

转换(迁移)的五要素

源状态:即受转换影响的状态

目标状态:当转换完成后对象的状态

事件:用来为转换定义一个事件,包括调用、改变、信号、时间四类事件

监护条件:布尔表达式,决定是否激活转换、

动作:转换激活时的操作

读图小结

  • 与状态off相关的转换有两个,其触发事件都是turnOn,只不过其监护条件不同。如果对象收到事件turnOn,那么将判断壶中是否有水;如果[没水],则仍然处于off状态;如果[有水]则转为on状态,并执行"烧水"动作
  • 而与状态on相关的转换也有两个,如果"水开了"就执行turnOff,关掉开关;如果烧坏了,就进入了终态了

案例二:带有复杂转换的状态图

复杂转换

  • 外部迁移是一种改变对象状态的迁移。外部迁移用从源状态到目标状态的箭头表示。如图10-15所示即描述了火车上卫生间的简单状态迁移该卫生间存在3个状态,包含5个外部迁移
  • 内部迁移是指状态不变的情况下,事件引发的动作。
    内部迁移自始至终都不离开源状态,所以不会产生入口动作和出口动作。因此,当对象处于某个状态进行一些动作时,可以把这些动作看成是内部迁移。
    在图10-16中,当处在登录口令状态(Enter Password)时,以下的两个动作都不会改变当前的状态。
    (1)用户设置密码时,当前状态不会发生改变,可以把这一动作建模为内部迁移:set/reset password。
    (2)显示帮助时,当前状态也不会改变,可以把这一动作建模为内部迁移:help/show help。
  • 各种转换的区别
    进入和退出转换:当进入一个状态时,执行某个动作;或当退出某个状态时,执行什么动作。这时就可以使用进入和退出转换来表示
    内部转换:用来处理一些不离开该状态的事件

活动与事件

活动:当对象处于一个状态时,它一般是空闲的,在等待一个事件的发生。但是某些时间,你可能希望描述个正在进行的活动。在处于一个状态的同时,对象做着某些工作,并一直继续到被某个事件中断。语法表示:do/动作名

延迟事件:延迟事件是一种特殊的事件,它是指该事件不会触发状态的转换,当对象处于该状态时事件不会丢失,但会被延迟执行。例如,当E-mail程序中正在发送第一封邮件时,用户下达发送第二封邮件执令就会被延迟,但第一封邮件发送完成后,这封邮件就会被发送。这种事件就属于延迟事件。语法表示:事件/defer

变化事件:用关键字when,后面跟上布尔表达式。例如when(temperature)>120)/alerm( )

时间事件:用after或when

复合(组合)状态

状态分为简单状态和复合(组合)状态。包含子状态的状态称为复合状态 。复合状态包括顺序状态、并发状态和历史状态

如果一个组成状态的子状态对应的对象在其生命周期内的任何时刻都只能处于一个子状态,也就是说状态机图中多个子状态是互斥的,不能同时存在,这种子状态被称为顺序状态或互斥状态或不相交状态在顺序状态中最多只能有一个初态和一个终态

案例三:顺序状态

ADSL拨号过程的状态机,它将拨号过程封装成一个组合状态"连接ISP"。最初的状态是"未连接",当用户发出指令时,将进入"连接ISP"状态,如果在此过程中用户取消拨号或发现无拨号音,无应答音时将回到"未连接'状态,如果收到应答音,则进入"已连接"状态。

建立大致印象后再分析组合状态"连接ISP",会发现组合状态中也包含一个初态和终态,这是复杂组合状态所包含的状态机的初态和终态

案例四:并发复合状态图

有时组成状态有两个或多个并发的子状态,此时称组成状态的子状态为并发子状态。

如果并发子状态中有一个子状态机比其它并发子状态先到达终态,先到的将等待,直到所有子状态到达终态。

历史状态
  • 历史状态用于在复杂的组合中标记转移过后需要返回的状态。
  • UML状态机图中历史状态分为浅历史状态(历史状态)和深历史状态(详细历史状态)两种。
  • 当一个历史状态记忆了各个嵌套层次的子状态时这个历史状态就是深的(deep)。如果它只记忆了最高层次嵌入的子状态,那么就说这个历史状态是浅的(shallow)。
  • 案例五:历史状态案例
    "一个圆圈中加上字母H",用来表示历史状态的。它的含义是:当从状态"结账"和"显示购物车"返回子状态"显示索引信息"时,将进入的是离开时的历史状态。也就是说,转到购物车或结账区之后,再回到"浏览目录"的页面时,其中的内容是不变的,仍然保留原来的信息。

练习

课堂练习一

图书管理系统中的图书主要有四种状态:新书进入流通状态、待借出状态、已借出状态、退出流通状态。对于购买的图书,图书管理员编制条码,完成入库操作后,图书进入流通状态。图书管理员将已编制条码的图书存放到规定的藏书地点,即图书上架此时图书进入待借出状态。当读者将图书借出后,图书便进入已借出状态。当读者归还所借图书后,图书又返回待借出状态。如果图书丢失或损坏不能继续借阅,则退出流通,此时图书进入退出流通状态。

练习二:

根据下面的描述,绘制一副状态图:电话初始时处于"空闲"状态,当听筒被拿起后处于"激活"状态。听筒被拿起后,电话等待拨号,若在30秒之内拨号,电话将进入"拨号"状态,如果拨号正确则电话进入"正在接通中"状态,如果拨号不正确则会一直听到提示错误拨号。若拿起听筒30秒之内不拨号,则电话处于"超时"状态。在"正在接通中"状态下,若对方占线则电话进入"忙"状态,若对方不占线则进入"接通"状态,对方拿起听筒后,电话处于"通话"状态,若在通话中对方挂断则进入"挂起"状态。

活动图

UML分结构型图和行为型图,结构是静态的,有类图、对象图、构件图、部署图、包图。行为是动态的,有活动图、状态图、顺序图、通信图、用例图、时序图。每种图是从需求或设计的不同层面来描述模型,以便于所有参与者通过图形化的方式从各个角度了解产品。
活动图描述的是从一个活动到另一个活动的控制流,描述活动的顺序,活动表示处理事物的动作和状态。

案例1:

活动描述:小张每天醒来后先看表是否到起床时间,如果没到继续睡觉;如果到了,抓紧时间起床,洗漱完毕后吃早餐,饭后出门。

活动图如下:

上图绘制的就是小张早晨日常生活的活动图,通过这种图形化模型可以把动作的流程性表达的更加清楚,动作的内容、流程、判断、交互、并发都能很好的表达。

活动图分析:

  • 开始与结束:活动图只能有一个起点,但可以有多个终点的。
  • 分支判断:菱形代表分支判断,这个与流程图的分支判断是一样的。上面的分支判断意思是:睡醒后看时间是否到上班时间,如果没到,继续睡觉;如果到了,起床洗漱。
  • 分叉与汇合:分叉与汇合必须组合使用,表示并发动作。分叉表示一个活动完成后产生后续的多个并行的活动;汇合表示多个活动全部完成后再进行下一个活动。分叉是一个指入多个指出,汇合是多个指入汇集后,一个指出。分叉与汇合间的活动是并行执行的,最后都执行完后统一汇合进入下一活动。
  • 活动:活动用圆角矩形表示,活动间的控制流用实体箭头表示。活动表示流程中的动作,活动可大可小,活动可以继续拆分成更细小的活动。

案例2:

活动描述:产品经理的工作流程,产品在立项前,先要分析市场,进行产品定位和可行性分析;项目成立后,要进行需求分析,通过需求分析编写出商业需求文档、市场需求文档和产品需求文档,之后,根据需求绘制原型产品设计、流程分析。这些工作完成后进入开发阶段:架构设计、概要设计、详细设计、代码开发、软件测试。

以上活动整理成活动图如下:

解读"产品生命周期"活动图:

上图是产品生产的整个生命周期(生产不包括产品的维护及运营),做产品前先要为产品进行定位,指明产品方向,之后可行性研究(技术可行性、经济可行性和社会可行性),这三种可行性是并行执行的。

项目立项后,对产品进行需求分析,需求阶段会出三个文档性成果物:商业需求文档(BRD)、市场需求文档(MRD)、产品需求文档(PRD)。在上图中把这三个文档用长方形框 表示,长方形框表示对象 ,意思是经过需求分析后生成了的三个文档对象。对象可以做为下一个活动的输入,也可以是活动的输出,输入与输出的对象可以是一个或多个。之后,再经过原型设计、技术设计、开发、测试,最后产品上线。

对象

对象用长方形框 表示,对象的名称是名词。活动可以有多个输入和输出,对象可以成为活动的输入

案例3:

  • 活动描述:客户在购物网站上购物并下单,支付后生成送货单,供应商送货,送货后本次订单结束。
  • 像这种情况涉及到客户、系统与供应商间的交互,客户的活动有下单、选择支付;系统生成送货单并收款:供应商活动有送货及修改订单动作。如使用之前的活动图形式就很难表达出客户、供应商与系统间的活动,如想要更好的表达角色与活动间的关系,就需要把角色加进来,在这里叫做泳道

    泳道 :上图中的客户、系统、供应商所属的大的长方形框就为各个对象的泳道,泳道内的活动表示此对象所属的动作,通过跨泳道的信息交互可以更好的表达出对象间与活动间的信息交互。泳道名应为对象名,既然是对象名,所以泳道名应为名词。

带对象流的活动图

1、当用户下订单时,将创建一个Order类的实例用来存放订单的信息,该类还包含这对应的Oderitem

2、当"生成送货单"时,将根据Order类的实例创建多个DeliverOrder(送货单)的实例

3、当"修改订单项状态"之后,DeliverOrder对象的状态将变成finished

案例4:

小张去必胜客饭店吃饭,发现要排队等待,他决定如果15分钟还轮不到就到隔壁肯德基吃饭,请绘制小张吃饭的活动图。

  • 在"小张"这个泳道中,两个控制流中只有一个会控制流会执行。在时间信号发生之间,收到当必胜客饭店发出"有空位"信号,小张接收到"有空位"信号时,小张才会执行"进入必胜客"的活动:否则小张会执行"进入肯德基"
  • (1)时间信号:时间信号是用来表示随着时间的流逝而自动发出的信号,时间信号表示,当时间到达某个特定的时刻时,就会触发时间事件,例如每天10点时,闹钟开始响铃,10点钟发出响铃的信号就是时间信号。
  • (2)发送信号:也就是发出一个异步消息,对于发送者而言,就是发送信号;对于接收到这种消息的目标而言,就是"接收信号'。
  • (3)接收信号:就是接收者收到的一个外部信号。

其他活动图简介

标识参数的活动图

参数是一个对象节点,用一个小矩形框表示,有输入参数、输出参数和错误参数。

表示活动"计算利息"节点将接受三个输入参数:本金(principal)、利率(rate)、年限(year);如果传入的参数合法,那么将输出参数利息值(accrual);如果输入了错误的参数,则产生异常。

标识扩展区的活动图

在活动图中,有时需要表示一个活动需要多次执行的情况。例如在图中,有三个活动节点"供应商送货","修改订单项状态"以及分支"所有订单项已送货完毕"都需要多次执行。 由于一个订单对应多个"送货单",因此通过"分支"来表示其循环控制流,这样表示活动,并不准确。我们采用了扩展区来表示活动节点的循环执行。

嵌套活动图

如果一个动图又包含了子活动图,则称这种图为嵌套活动图(也称为主活动图)。当一个活动图很复杂,我们可以把其中的一组相关活动看作一个子活动图,这时,在嵌套活动图中,用子活动图的简图代替子活动图。我们可以将子图单独放在一个图中详细说明它的活动,然后,在嵌套活动图引用子活动图。

练习

课堂练习1

销售合同签订后,要进行核对。如果发现错误,则终止履约;如果没有错误,则要核对货物清单确定是否有货,还要核对付款单确定对方是否已经付款,只有这两项都完成,才可以发货。如果无货或对方尚未付款,则终止履约。

课堂练习2

公司业务员打电话给客户,确定一个约定,如果约定的地点是在公司内部,那么行政部的同事需要为会面安排一间会议室,如果约定的地点是在公司外部,那么业务员需要用笔记本准备一份陈述报告。业务员与客户在约定的时间和地点见面,业务员准备好会议用纸,如果会议产生一个陈述,业务员需要记录下来备案。请绘制普通活动图和带泳道活动图

活动图小结

• 讲解了活动节点、初始节点和活动终点、转换、分支与监护条件、分岔与汇合等基本建模元素;逐步引出了泳道、对象流等控制流逻辑

• 介绍了其他复杂活动图

顺序图(时序图)

案例1 赤壁之战

  • 赤壁之战是用例,其用例图为:

    • 曹操举兵南下,刘备请孔明拟定策略,派遣关羽和张飞防守荆州,同时,派遣孔明联络
    • 孙权共同对抗曹操。孔明联合孙权,借东风,火烧曹军于赤壁。
  • 各人物的主要操作:类图表示



顺序图的相关概念

交互图 表示类(对象)如何交互来实现系统行为。交互图具有如下两种形式。

1)顺序图(时序图)

它描述对象按时间顺序的消息交换过程 ,它体现出系统用例的行为。

2)通信图

它描述对象间的组织协作关系,它也可体现出系统用例的行为。

一、顺序图的概念

顺序图是两种类型的交互图之一 。顺序图用来建模以时间顺序安排的对象交互 ,并且把用例行为分配给类(对象)。它是用来显示参与者如何采用若干顺序步骤与系统对象交互的模型

  • 顺序图样式

    1、对象的符号
    时序图中的每个对象显示在单独的列里。

2、对象的左右排列位置

对象的左右顺序并不重要,但是为了图面的清晰整洁起见,通常应遵循以下两个原则:

(1)把交互频繁 的对象尽可能地靠拢

(2)把初始化整个交互活动的对象(有时是一个参与者)放置在最左边

二、生命线(lifeline)

表示对象的生存时间。生命线从对象创建开始到对象销毁时终止。

三、消息

  1. 消息的概念
    对象之间的交互是通过互发消息 来实现的。一个对象可以请求(要求)另一个对象做某件事件。
    消息从源对象指向目标对象。消息一旦发送便将控制从源对象转移到目标对象。
    时序图中,消息的阅读顺序是严格自上而下的
  2. 消息的类型与符号
    • (1)简单消息
      简单消息是没有区分同步和异步 的消息。
      简单消息用从一对象的生命线指向另一个对象的生命线的直线箭头来表示,箭头上面标出消息名。

      消息是顺序图活动对象之间通信的惟一方式。UML中的消息使用了一些简洁的标记符
      消息可以包含条件以便限制它们只在满足条件时才能发送 。条件显示在消息名称上面的方括号中,如下图所示。
    • (2)同步消息
      消息的发送者把进程控制传递给消息的接收者,然后暂停活动,等待消息接收者的回应消息

      你叫我去吃饭,我听到了就和你去吃饭;如果没有听到你就不停的叫,直到我告诉你听到了,才一起去吃饭:
    • (3)异步消息
      消息的发送者将消息发送给消息的接收者后,不用等待回应的消息,即可开始另一个活动。

      你叫我去吃饭,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。

四、激活

1、激活的概念

当一个对象没有被激活期时,该对象处于休眠状态 ,什么事都不做,但它仍然存在,等待新的消息来激活它。

当一条消息被传递给对象的时候 ,它会触发该对象的某个行为,这是就说该对象被激活了。

当一个对象处于激活时,表明该对象正在执行某个动作

2、激活的符号

激活用一个细长的矩形框(在生命线上)表示。

矩形框的高度表示对象执行一个操作所经历的时间段 ,矩形的顶部表示动作的开始,底部表示动作的结束。

对象接收消息后可以由自己的某个操作来完成,也可以通过其他对象的操作来完成。

实例:图书馆借书处理的顺序图

  • 用例:借书
  • 参与者:管理员,借阅者
  • 基本事件流:
    1.借阅者带着借书证和书来到柜台。
    2.管员输入借阅者的借书证编码。
    3.系统检查借阅者的合法性。
    4.系统显示借阅者的信息。
    5.系统检查借阅者的借阅信息。
    6.管员输入所借图书的条码。
    7.系统显示所借图书的信息,并登记图书。
    管员重复6~7步,直到结束。
    8.系统登记借阅者的本次借阅信息,并显示。
  • 扩展事件流:
    3a.借阅者身份非法,提示,本次拒借。
    5a.该借阅者所借图书中有超期的,则提示,本次拒借。
    5b.该借阅者所借图书数量超过了上限,则提示,本次拒借。
    ①识别交互过程。
    读者在借书时,先由管理员把借书证上的读者编号扫描给系统,系统检查这个读者的借书证合法信息,如果不合法,则系统给出提示,如果正确系统返回读者的身份
    信息,以及读者的借阅信息。
    如果读者借书数量没有超过借书的上限,则把要借书的图书编号输入系统,系统登记借书信息,并返回借书成功信息,借书过程完成。
    ②识别参与交互过程的对象;

    ③ 为每一个对象设置生命线,并确定对象的存在期限;
    ④从引发交互的初始消息开始,在对象生命线上依次画出交互的消息
    ⑤绘制顺序图

顺序图的其他技术

1.创建对象

创建对象的标记符如下图中的示例所示。有一个主要步骤用来把"create''消息发送给对象实例。对象创建之后就会具有生命线 ,就像顺序图中的任何其他对象一样。现在可以像顺序图中的其他对象那样来使用该对象发送和接收消息。在处理新创建的对象,或者处理顺序图中的任何其他对象时,都可以发送"destroys'"消息来删除对象 。若要想说明某个对象被销毁,需要在被销毁对象的生命线上 放一个X字符

2.分支和从属流

有两种方式来修改顺序图的控制流:使用分支和使用从属流。控制流的改变是由于不同的条件导致控制流走向不同的道路。

  • 分支是指从同一点发出的多个消息并指向不同的对象 ,根据条件是否互斥,可以有条件和并行两种结构

    注意:消息的开始位置是相同的,分支消息的结束高度也是相同的。
  • 从属流指的是从同一点发出多个消息指向同一个对象的不同生命线

结构化控制结构

  • 对于复杂的控制流可以用组合片段来表示。例如:

    上图展示了一个简化了的例子,其中有一些控制操作符。用户启动这个序列。第一个操作符是循环操作符,圆括号内的数字(1,3)表示循环执行的最少次数和最多次数。因为最少是一次,所以在检测条件之前主体至少执行一次。在循环内,用户输入密码,系统验证它。只要密码不正确,那么该循环就会继续。但是,如果超过了三次,那么无论如何循环都会结束。

    下一个操作符是可选操作符。如果密码是正确的,那么就执行这个操作符的主体;否则就跳过该顺序图后面的部分。这个可选操作符的主体内还包括了一个并行操作符。正如图中所表明的,操作符可以嵌套。

    并行操作符有两个分区:一个让用户输入帐号,另一个让用户输入数额。因为这两个分区是并行的,所以没有规定应该按照什么次序输入这两者,按照什么次序输入都可以。需要强调的是,并发并不总是意味着物理上的同时执行。并发其实是说两个动作没有协作关系,而且可按任意次序发生。如果它们确实是独立的动作,那么它们就可以交叠;而如果它们是顺序的动作,那么它们可以按任意的次序发生。

    一旦并行操作符的两个动作都被执行过,那么该并行操作符也就执行完毕。在可选操作符中的下一个动作是银行向给用户交付现金。至此,顺序图执行完毕。

  • 条件判断:标记为alt,用于描述if...else...这种结构

  • 可选:只是一个if,没有else if或者else,标记为opt。

  • 循环:

    循环的标记为:loop

    例如:下图中[m.n]是指至少执行m次,最多执行n次

  • 并发:标记为par,描述多线程的情况

建立顺序图的步骤

①从用例中识别交互过程;

②识别参与交互过程的对象:

③为每一个对象设置生命线,并确定对象的存在期限;

④从引发交互的初始消息开始,在对象生命线上依次画出交互的消息;

⑤如果需要,可以给消息增加时间约束,以及前置条件和后置条件

课堂练习

• 某中学的计算机分为三种:教师个人办公计算机、教室公用计算机和实验室计算机。现要为该学校开发一套设备报修系统,具体流程为:

1、故障计算机负责人登录网上的报修系统

2、填写报修信息:包括报修人、联系方式、地点、故障设备、故障描述、预约上门时间等。

3、电教主任在后台接到申请后,打印保修单,委派维修人员

4、维修人员维修后,报修人在报修单上签字确认

5、报修人员登录系统对此次维修做出评价

6、期间,报修人在提交报修申请,但电教主任未受理时,可以取消报修申请

7、报修结果分为以下几种:修好、维修好、报修人取消和故障不能重现等。

请绘制出该系统中"报修"用例的顺序图。

通信图(协作图)

案例1:赤壁之战思考:孔明向哪些对象发送了消息?又接收了哪些对象发送的消息?

通信图的构成

  • 对象
    通信图与顺序图中的对象的概念是一样只不过在通信图中,无法表示对象的创建和撤销,所以对于对象在图中的位置没有限制

  • 通信图中链的符号和对象图中链所用的符号是一样的,即一条连接两个类角色的实线
    对于链接还可以加上"角色"与"约束;在链角色上附加的约束有global(全局),local(局部),parameter(参数),self(自身),broadcast(广播):
  • 消息

实例:图书馆借书处理的协作图

顺序图与通信图的异同

1顺序图和协作图都属于交互图,用来描述对象之间的动态关系。

2顺序图强调消息的时间顺序,协作图强调参与交互的对象的组织关系。

3顺序图和协作图在语义上是等价的,两者可以相互转换。

课堂练习

请将图书馆还书处理的顺序图转换成通信图

相关推荐
shinelord明1 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
人才程序员1 天前
QML z轴(z-order)前后层级
c语言·前端·c++·qt·软件工程·用户界面·界面
Theodore_10222 天前
3 需求分析
java·开发语言·算法·java-ee·软件工程·需求分析·需求
做人求其滴2 天前
GDPU软件工程习题(挖空版)
软件工程
MrFlySand_飞沙2 天前
软件工程
软件工程
jokr_2 天前
【软件工程复习】
软件工程
云空2 天前
《软件工程文档攻略:解锁软件开发的“秘籍”》
软件工程
人才程序员2 天前
【无标题】
c语言·前端·c++·qt·软件工程·qml·界面
Aderversa2 天前
关于数据流图绘制和使用上的一些个人经验
软件工程
梁辰兴3 天前
UML 建模实验
软件工程·uml·建模