Hello,everybody. 这一期我们来探讨一下UML中的协作图。
协作图(Collaboration Diagram,又称协同图)也是交互图的一种,它主要描述用例在实现过程中参与的对象以及对象之间的交互消息。
可以认为协作图是序列图的另外一种表示交互的方法,但它不强调时间和序列。
协作图的主要用途是描述类的一个操作的实现,用于描述对象之间的简单交互。
协作图主要由对象(Object)、消息(Message)和链(Link)三个元素构成。
协作图中的对象与序列图中的对象概念相同,也是类的一个实例,其应该是类图中某个类的实例。
对象的表示法也与序列图中相同,其命名方式也相同:
即:“对象名:所属类名”、“对象名”或“:所属类名”三种,同时也在名称下画一条横线,以表示其是类的一个实例。
也可以使用下面的形式来表示类的多个实例:
协作图中的消息与序列图中的消息概念相同,都是从一个对象(发送者)向另外一个对象或几个其它对象(接收者)发送信号,或由一个对象(发送者或调用者)调用另外一个对象(接收者)的操作。
协作图中的消息也是由三个基本部分构成:发送者、接收者和消息名称。
消息也是由带消息名称标签的箭头表示。它附着在对象之间的链上。箭头方向指向消息的接收者。
一个消息也可以发送给对象自己,即消息的发送者和接收者都是对象自己。
每个消息都有一个序号,用以表明消息的发送顺序。消息也有自己的名称,即操作的名称,也可以附带参数,即操作的参数。
下图中的“1:getRecords(reader)”及箭头即表示一个消息。它表示对象borrowForm要调用borrowRecords对象的一个操作。
链是对象之间的连接,也是类关联的一个实例。在协作图中,链使用实线或弧来连接两个对象。
链也可以位于一个对象跟自己的连接,链的起点和终点在一个对象上。
如下图就是链位于单个对象上的情形。
(1)设置交互的语境;
(2)设置交互的场景;
(3)对每个对象设置初始特性;
(4)描述对象之间可能有信息沿着它传递的链;
(5)设置消息的顺序号。
(1)确定用例中的交互过程——要描述哪个交互;
(2)识别参与交互过程的对象——有哪些对象参与到交互中来;
(3)如果需要,为每个对象设置初始特性——这些初始值对对象间的交互是否有影响,有的话可以添加,否则所有对象都有类似的行为;
(4)确定对象之间的链, 及沿着链的消息——对象之间有消息传送,就可以确定一个链;
(5)从引发该交互过程的初始消息开始,将每个消息附到相应的链;
(6)可以使用特别技巧设置消息的循环发送、时间约束等;
(7)如果需要,可以为每个消息设置前置条件和后置条件。
仍以图书馆借阅系统为例说明协作图的创作过程。
(1)确定一个交互
读者还书时,图书馆工作人员使用归还图书帮助读者完成还书的交互过程。
(2)确定参与的对象
图书馆工作人员、还书界面、借阅记录、业务逻辑处理和数据库。
(3)绘制对象
在Rose中,“Logical View”(逻辑视图)上右击,然后选择“New”(新建),然后再选择“Collaboration Diagram”(协作图),如下图所示:
将新建的协作图命名为“还书协作图”。
双击“还书协作图”,则可以打开绘图界面。
协作图中工具箱中的内容及含义如下:
创建对象时,可以直接从左侧的元素浏览器中,把相应的类拖拽到协作图绘制区中来。
本例中,从左侧把图书馆工作人员、还书业务逻辑、还书数据处理逻辑、还书界面、借阅记录相关类拖拽到绘图区,形成以下情形:
(4)确定对象之间的链
根据还书业务,哪些对象之间有消息发送,则可以绘制对象之间的链。
绘制链的方法是,在工具箱中选择“对象链”,鼠标会变为一个向上的箭头,如下图所示:
将鼠标移动到其中一个对象上,按下鼠标并滑动到另外一个对象上后,松开鼠标,则创建完两个对象之间的链了。
如果想删除一个链,可以选中链之后,按下“CTRL+D”组合键,或者在链上右击,然后选择“Edit”(编辑),再选择“Delete From Model”(从模型中删除),则可以彻底删除该链。
本例中最终形成以下效果:
(5)为链添加消息
选择工具箱中的“链消息”或“链的反向消息”工具为链添加消息。
当选择一种消息后,鼠标会变为黑色十字图标,在要添加消息的链上点击后,则完成添加消息,如下图所示:
点击后的消息暂无名称,只有序号,如下图所示:
我们可以通过双击消息箭头来为消息命名或通过两次点击(注意不是双击)序号来直接输入消息的名称。
下图是通过双击箭头来命名的图示:
点击“Apply”(应用)按钮,则可以在链上显示消息名称。
同时,在“Detail”选项卡中指定消息的类型和频次。如下图:
界面中,上部分指定消息的“同时性”特征,从上到下分别为:简单消息、同步消息、阻断消息、超时消息、过程调用、异步消息和返回消息。
其中阻断消息和超时消息是Rose添加的两种消息。
阻断消息是指消息发送者只有在消息接收者能接受消息时发送消息,否则消息发送者将放弃该消息。
超时消息是指发送消息的对象在发送消息时指定等待时间,如果消息接收者未能在指定时间内处理完该消息,则消息发送者将放弃该消息。
过程调用是指对象发出消息后,等待处理消息的整个过程完毕后才继续工作。
消息的频次可以设置消息按规定的时间间隔发送。
其中,Aperiodic是指不定期发送的消息,Periodic是指定消息为定期发送。
我们也可以双击链或右击链后选择“Open Specification...”来为链添加消息。
这两种操作都会打开一个下图所示的对话框。
在该对话框的“General”选项卡中可以设置链的名称,关联的名称,以及作为提供者类和客户类的可见性。
“Messages”选项卡中的内容如下:
在这里,可以修改链上已有消息的内容或添加新消息。
在已有消息中双击后弹出的对话框与双击消息箭头时弹出的对话框相同,可以进一步指定消息的名称、消息的类型等内容。
在上图空白处右击,可以选择“Insert To”命令为链的某一端对象添加操作(消息提供者)。如下图所示:
在插入新建消息时,要指明消息的提供者(操作的提供者)。
也可以在已有的消息上右击选择“<new operation>”,为链添加方向一致的消息。如下图所示:
(6)调整对象布局
设置完对象的消息后,通过调整对象的布局,消息的排列,使图阅读更加容易。
本例的最终效果如下图所示:
在Rose中,序列图和协作图可以相互转换。
由序列图生成协作图的具体操作方法为:
(1)打开已经创建好的序列图;
(2)选择“Browse”菜单下的“Create Collaboration Diagram”或按下F5快捷键,则完成了由序列图生成协作图的操作。
(3)优化排列 虽然生成了协作图,但排列还比较混乱,需要通过调整对象的位置和对象间的距离来完整显示相关内容。
下图是由上篇文章中绘制的序列图生成的协作图。
以上是关于协作图的有关内容,如有问题请留言。
新闻热点
疑难解答