第4章顺序图与协作图4.1交互图概述Interactiondiagram,是描述对象之间的关系和对象之间的信息传递的图;通常用来描述一个用例的行为,实现一个用例,完成对系统的动态行为建模;包含两种:顺序图(或时序图,sequencediagram)协作图(collaborationdiagram)顺序图面向时间描述对象交互的图协作图对象间消息的结构化视图4.2顺序图按照时间顺序显式对象之间交互的图4.2.1顺序图的组成活动者(actor)或者对象(object)生命线(lifeline)激活(activation)/控制焦点(focusofcontrol)消息(message)4.2.2活动者或对象活动者和对象按照从左到右的顺序排列一般最多两个活动者,他们分列两端。启动这个用例的活动者往往排在最左边;接收消息的活动者则排在最右端;对象从左到右按照重要性排列或按照消息先后顺序排列。4.2.2活动者或对象对象的命名方式有三种:包括对象名和类名类名(匿名对象)对象名(不关心类)4.2.3生命线生命线(Lifeline):每个对象都有自己的生命线,用来表示在该用例中一个对象在一段时间内的存在垂直的虚线如果对象生命期结束,则用注销符号表示对象默认的位置在图顶部,表示对象在交互之前已经存在如果是在交互过程中由另外的对象所创建,则位于图的中间某处。4.2.4激活期激活期(activation)/控制焦点(focusofcontrol)对象在一段时间内获得了焦点,也称激活期对象执行某个动作的时期空心矩形条激活期的长短意味着对象执行某个动作的时间有多长,可以通过约束{10ms}来限制执行时间的长短。4.2.5消息面向对象方法中,消息是对象间交互信息的主要方式。结构化程序设计中,模块间传递信息的方式主要是过程(或函数)调用。对象A向对象B发送消息,可以简单地理解为对象A调用对象B的一个操作(operation)。4.2.5消息顺序图中,尽力保持消息的顺序是从左到右排列的。一个顺序图的消息流开始于左上方,消息2的位置比消息1低,这意味着消息2的顺序比消息1要迟。因为西方的阅读习惯是从左到右。顺序图中消息编号可显示,也可不显示。协作图中必须显示。4.2.5消息UML三种消息:调用(ProcedureCall)异步(Asynchronous)返回(Return)Rose扩充:阻止(Balking)超时(Time-out)4.2.5消息UML三种消息:调用(ProcedureCall)发送者把消息发送后,等待直到接收者返回控制,可以表示同步;实心箭头符号4.2.5消息UML三种消息:异步(Asynchronous)消息发送后,发送者继续操作,不等待,常用于并发;4.2.5消息UML三种消息:返回(Return)表示消息的返回。消息上方放置返回值同步消息的返回可以画出(如果想明确表达返回值),也可以不画出,直接隐含。异步消息可以有返回,也可以没有。(可以响应异步消息,也可以不响应该异步消息。)如果顺序图上显示有编号,则返回消息的编号和当初发送消息的编号完全一样。虚线箭头表示,和依赖关系不要混淆4.2.5消息自调用(SelfCall)某对象自己调用自己的操作UML标记(嵌套的矩形条)Rose标记4.2.5消息Rose新增消息阻止(Balking)接收者如果无法立即接收消息,则发送者放弃该消息超时(Time-out)如果接收者无法在指定的时间内接收消息,则发送者放弃该消息Q:这两种消息可以看做是同步or异步消息?4.2.5消息格式[前缀][守卫条件][顺序表达式][返回值:=]消息名([参数列表])例:2:display()简单消息1.3.1:p:=find()带返回值的嵌套消息[x0]4:invert(x,color)条件消息3.1*[x=1..10]:update()循环消息a3,b4/c2:copy(a,b)线程同步1.1a,1.1b/1.2:continue()带前缀消息在发送线程c的第2个消息之前,必须先发送线程a的第3个消息和线程b的第4个消息在发送消息1.2之前必须已经同时发送并发消息给线程a和b前缀(predecessor)语法:消息序列号,消息序列号,.../前缀是一个用来同步线程或路径(path)的表达式意思是在发送当前消息之前指定序列号的消息被处理(必须连续执行)消息序列号之间用逗号隔开,用斜杠结束例如1.1a,1.1b/1.2:continue(),在发送消息1.2之前必须已经同时发送并发消息给线程a和b守卫条件(guard-condition)语法:[条件短语]条件短语通常用伪代码或真正的程序语言来表示,UML并不规定其语法例如,[x0]4:invert(x,color)序列表达式(sequence-expression)语法[integer|name][recurrence]:integer为指定消息顺序的序列号,消息1是消息序列的开始消息消息,1.1是消息1的处理过程中的第一条嵌套的消息,消息1.2是消息1的处理过程中的第二条嵌套的消息,一个消息序列的例子如1,1.1,1.2,1.2.1,1.2.2,1.3,等。这样的序列号不仅能够表示消息的顺序而且还能表示消息的嵌套关系(当消息是异步消息时消息为嵌套的操作调用及返回)name表示并发控制线程,例如1.2a和1.2b为同时发送的并发消息recurrence表示一个条件或迭代的执行有两种选择*[循环子句]循环子句(iteration-clause)用来指定一个循环(重复执行)例如:一个包括循环的消息1.1*[x=1..10]:doSomething()[条件子句]条件子句一般用来表示分枝而不是用作守卫条件[x0]是两个可以用来分枝的条件子句这两个条件只能有一个为真因而只有一个分枝被执行(即发送与分枝有关的消息)条件子句和循环子句都可以用伪代码或真正的编程语言来表示序列表达式用冒号结束返回值、消息名和参数表返回值表示一个操作调用(即一个消息)的结果4.2.6Rose中的消息Simple和Asynchronous都可表示异步,UML1.4之后的版本用Simple消息表示异步ProcedureCall和Synchronous和都可表示同步,UML早期版本用“同步消息”这一术语,目前常用ProcedureCall消息表示同步Return不变新增balking和time-out消息4.2.7建立顺序图的步骤确定交互的范围;识别参与交互的对象和活动者;设置对象生命线开始和结束;设置消息;细化消息;4.2.8案例:存款分析级别的顺序图,粗略,双斜杠忽略消息同步异步类别也无妨Addtitle新增书目和图书操作4.2.9练习用户打印文件,计算机向打印服务器发送打印命令,打印机如果空闲,则直接打印,否则把打印文件存储在打印队列中。4.2.9练习管理员通过课程管理器打印课程UML的信息顺序图制作提示:只关注核心对象顺序图用于描述某个用例的部分交互细节管理员通过课程管理器打印所有课程信息-41-:Sale:Cashier:POST:SalesLineItem:ProductCatalog:ProductSpecification1.enterItem(int,int)1.1.//[isNewSale()]create()1.2.getSpecification(int)1.3.makeLineItem(ProductSpecification,int)1.1.1.//create()1.2.1.//find(upc)1.3.1.//create()1.3.2.//add(sl)示例-POST类enterItem方法实现//1.1创建Sale实例if(isNewSale()){sale=newSale();}//1.2获得ProductSpecificationProductSpecificationspec=productCatalog.getSpecification(upc);//1.3添加销售项sale.makeLineItem(spec,qty);publicvoidenterItem(intupc,intqty){if(isNewSale()){sale=newSale();}ProductSpecificationspec=productCatalog.getSpecification(upc);sale.makeLineItem(spec,qty);}由顺序图产生实现代码-42-:POSTactor:Cashier:Sale:SalesLineItem:ProductCatalog:ProductSpecification:SalesLineItem1.2.1:find(upc)1.3.2://add(sl)1.3.1:create()1.1.1:create()1:enterItem(int,int):void1.3:makeLineItem(ProductSpecification,int):void1.2:spec:=getSpecification(int):ProductSpecification1.1:[isNewSale()]//create()示例-POST类enterItem方法实现//1.1创建Sale实例if(isNewSale()){sale=newSale();}//1.2获得ProductSpecificationProductSpecificationspec=productCatalog.getSpecification(upc);//1.3添加销售项sale.makeLineItem(spec,qty);publicvoidenterItem(intupc,intqty){if(isNewSale()){sale=newSale();}ProductSpecificationspec=productCatalog.getSpecification(upc);sale.makeLineItem(spec,qty);}由协作图产生实现代码4.3协作图描述系统对象(或活动者)如何共同协作实现用例;强调的是参与交互的对象的组织;一般,顺序图和交互图可以相互转换,Rose提供了转换工具。先画顺序图,再转成协作图更容易4.3.1多对象多对象是多个对象组成的集合,往往是同一个类的对象;如果消息同时发给多个对象,则用多对象表示;在顺序图中仍然显示为单对象一样的图标,rose中multipleinstance协作图中重叠的方框。4.3.2活动对象/主动对象主动对象是一组属性和一组方法的封装体,其中至少有一个方法不需要接收消息就能主动执行(称为主动方法)主动对象是不需接收消息就可自动启动交互的对象除了含有主动方法外,主动对象和被动对象无区别UML标记Rose标记4.3.3案例:存款