目录
在任何有意义的系统中,对象都不是孤立存在的,它们相互之间通过传递消息进行交互。
交互是一种行为,这种行为由语境中的一组对象为达到某一目的而交换的一组消息构成。
这些角色表示类、接口、构件、结点和用况的原型实例。
可以用两种方式来对一个交互建模:
一种方式着眼于消息是如何按照时间顺序调度的;
另一种方式则着眼于交互中对象间的结构关系,并考虑消息是如何在这个结构的语境中被传递的。
交互图分为
1、顺序图:强调消息的时间顺序
2、通信图/协作图:侧重于发送和接收消息的对象之间的组织结构
UML提供了对消息的图形化表示,如图所示。这种可视化的消息表示法强调了消息的最
重要的部分:名称、参数(若有的话)和顺序。在图形上,把消息表示为一条有向直线,
并且通常还包含相应的操作名。
参与交互的对象既可以是具体的事物,又可以是原型化的事物。作为具体的事物,一个对象代表现实世界中的某个东西,例如,p作为类Person的一个实例,代表一个特定的人;而作为原型化的事物,p可以代表类Person的任何实例【角色】。
可以把对象图看作是对交互的静态方面的表示,它通过说明所有一起工作的对象来设置交
互的场所。交互则通过引入可以沿着连接这些对象的链传递的消息的动态序列来进一步展
示交互。
对象图 + 消息传递 = 交互图
链是对象之间的语义连接。一般来说,链是关联的实例。如下图所示,在一个类与另一个类之间有关联的情况下,这两个类的实例之间就可能有链;在两个对象之间有链存在的情况下,一个对象就能向另一个对象发送消息。
1)图的顶部是一个类图,其中声明了类Person和Company以及这两个类之间的多对多关联 employee-employer。
2)图的中部展示了协作 WorkAssignment的内容:
为某个员工分配某个工作。这个协作包括两个角色以及二者之间的一个连接件。
3)图的底部是该协作的一个实例,其中有分别绑定到角色和连接件的对象和链。底部的一个具体消息表示在该协作中的原型消息的声明。
链指明了一个对象向另一个对象(或自身)发送消息的路径。多数时候,指明存在着这样一个路径就足够了。如果需要更精细地表示路径是如何存在的,可以用下面任意一种约束来修饰链的有关端点。
关联(association) 说明对应的对象对关联是可见的。
自身(self) 说明对应的对象因为是本操作的调遣者,所以是可见的。
全局(global) 说明对应的对象在全局范围内可见。
局部(local) 说明对应的对象在局部范围内可见。
参数(parameter) 说明对应的对象因为是一个参数,所以是可见的。
在传送一个消息时,对消息的接收通常会产生一个动作。这个动作可能引发目标对象以及该对象可以访问的其他对象的状态改变。
动作分类:
创建和撤销是用衍型显示的
当一个对象向另一个对象发送消息(实际上是将某个动作委派给了消息的接收者)时,接收对象可能接着会向另一个对象发送消息,这个对象又可能发送消息给下一个不同的对象,如此一直传下去。这个消息流形成了一个序列。任何序列都有开始,每个消息序列都是从某个进程或线程开始的。而且只要进程或线程还在活动,消息序列也就会继续。一个不间断的系统(如实时的设备控制),只要它在其上运行的结点没关闭,它就会一直执行。
系统中的每个进程和线程都定义了一个清晰的控制流。
在每一个流中,消息是按时间顺序排列的。为了在图形上更好地可视化一个消息的序列,可以显式地对消息在序列开始后的次序建模,
每个消息的前面加上一个用冒号隔开的序号作为前缀。
通信图展示一个协作中角色之间的消息流。如下图所示,消息沿着协作中的连接流动。通常可以用带填充箭头的实线来表示过程式的或嵌套的控制流,
其中消息findAt的序号为2.1,表示它是嵌套在第2个消息里的第1个消息。
1)过程式序列:【调用方式】
可以用枝杈形箭头表示的单调控制流来描述非过程式控制的每一步。
在下图中,消息assertCall的序号为2,表明它是序列中第二个消息。
2)单调序列:【发送方式】
1)对包含多重控制流的交互建模时,指明发送某一特定消息的进程或线程是很重要的。在UML中,可以把位于该序列根部的进程或线程的名称加到消息的序号之前,以此区分不同的控制流。
例如,表达式:
D5 : ejectHach(3)
表明作为序列中第五个消息的操作ejectHatch(具有实参3)以进程或线程D为根。
2)下面的表达式所示,具有实参“Rachelle”的操作find的返回值是p。这是一个嵌套的序列,
表明第二个消息嵌套于第三个消息中,而第三个消息又嵌套于第一个消息中。在同一张图中,p还可以在其他的消息中作为实际参数使用。
1.3.2 : p := find (“Rachelle”)
在某些交互中对象可以被创建(由create消息来说明)和撤销(由destroy消息来说明)。链也是一样:对象之间的关系可以建立(come)和消失(go)。为了指明一个对象或链在一个交互过程中是否出现和/或消失,可以在通信图中为它的角色附加一个注解。
在交互过程中,对象的属性值、状态和角色是经常改变的。可以通过在顺序图的生命线上显示对象的状态或者值来反映对象的改变。
在顺序图中,对象或角色的生命期、创建与撤销都通过其生命线的垂直延伸而显式地表示
在通信图中,必须使用注解表示创建和撤销。
如果展示对象的生命期是重要的,使用顺序图
在为交互建模时,通常既包括角色(每个角色代表交互实例中的对象),又包括消息(每个消息都代表对象之间的通信活动,并导致某些动作发生)。
可以采用两种方式来可视化地表示交互中所涉及的角色和消息:一种方式是强调消息的时间顺序,另一种方式是强调发送和接收消息的角色的结构组织。在UML中,第一种表示法称为顺序图;第二种表示法称为通信图。顺序图和通信图都属于交互图。(UML还有一种名为定时图的特殊交互图,它展示角色之间交换消息的准确时间。
顺序图允许对一个对象的生命线建模。一个对象的生命线代表该对象在某一特定时间内的存在,并可能覆盖该对象的创建和撤销。通信图允许对交互的对象之间可能存在的结构上的链建模。
展示了在一个发行和订阅机构语境中进行交互的一组角色(观察者设计模式的一个实例)。图中包括 3个角色:p(StockQuotePublisher 的实例)、s1 和 s2(都是StockQuoteSubscriber的实例)。该图是一个顺序图,强调消息的时间顺序。