面向对象方法第三章 3 6

发布 2019-08-24 02:55:00 阅读 8126

交互图主要是用来描述对象之间的动态协作关系以及协作过程中的行为次序。它常常用来描述一个用例的行为,显示该用例中所涉及的对象和这些对象之间的消息传递情况。交互图有两种形式,即顺序图和协作图,它们分别从不同的侧面来描述对象间的交互关系。

本节将以下面一个简单的例子来进行阐述。有一份订单并着手对他施行一个计算**的命令。为此,订单需要查看其上的所有订单项,并决定这些订单项的**,这是以各个订单项的产品定价规则为基础的,对所有的订单项都这样做好后,订单需要计算一个基于顾客规则的总折扣。

在面向对象技术中,对象间的交互是通过对象间消息的传递来完成的。在uml的四个动态模型中均用到消息这个概念。通常,当一个对象调用另一个对象中的操作时,即完成了一次消息传递。

当操作执行后,控制便返回到调用者。对象通过相互间的通信(消息传递)进行合作,并在其生命周期中根据通信的结果不断改变自身的状态。

在uml中,消息的图形表示是用带有箭头的线段将消息的发送者和接收者联系起来,箭头的类型表示消息的类型,如图所示。

uml定义的消息类型有三种:

简单消息(****** message) 表示简单的控制流。用于描述控制如何在对象间进行传递,而不考虑通信的细节。

同步消息(synchronous message) 表示嵌套的控制流。操作的调用是一种典型的同步消息。调用者发出消息后必须等待消息返回,只有当处理消息的操作执行完毕后,调用者才可继续执行自己的操作。

异步消息(asynchronous message) 表示异步控制流。当调用者发出消息后不用等待消息的返回即可继续执行自己的操作。异步消息主要用于描述实时系统中的并发行为。

可以将一个简单消息和一个同步消息合并称一个消息,原同步消息的箭头和简单消息的箭头分别放在合并后的消息两端。这样的消息意味着操作调用一旦完成就立即返回。

顺序图用来描述对象之间动态的交互关系,着重体现对象间消息传递的时间顺序。顺序图存在两个轴:水平轴表示不同的对象,垂直轴表示时间。

在顺序图(参见图8.1)中,对象用一个带有垂直虚线的矩形框表示,在举行框内标有对象名和类名。垂直虚线称为对象的生命线,它代表在对象之间的交互作用中该对象的生命期。

在生命线上的窄巨形条被称作激活(activation),表示该对象正在执行某个操作。激活矩形的长度表示计划的持续时间,既可以直接执行,也可以通过下级过程执行。巨型条的顶部表示动作的开始,底部表示动作的结束。

还可以通过将另一个激活放在它的父激活的右边显示。这种表示方法首先由jacobson推广使用。两根对象的生命线之间的箭头表示消息。

消息的箭头形状指明消息的类型时发送还是返回(如图8.1,从仓库货物类至订单项的箭头表示该消息是一个返回)。消息按发生的时间顺序从上倒下排列。

每个消息旁标注消息名:也可加上参数并标注一些控制信息。返回自身生命线的消息箭头叫回授(selfcall),表示对象发送消息给自己。

控制信息由两种。第一种是条件控制信息,它说明在什么情况下才会发送信息(例如,在[needstoreorder()=true]的条件下),消息仅当条件为真时才会被发送。第二种是重复控制信息,它表示消息多次发送给多个作为接收者的对象。

这种控制信息通常在当一个对象向某个对象集合中的每一个对象逐个地发送消息时使用(例如*prepare())

图3-33 顺序图。

图8.1是顺序图的示例,由此可见交互图是一种非常简单的扼要的可视化**,这也正是交互图的优势。同时我们也可看到,顺序图比较适合交互规模较小的可视化**,如对象很多,交互又很频繁,则将使顺序图变得复杂起来,这是顺序图的一个弱点。

在图8.1种还可以看出,在顺序途中可以使用返回(returen)消息,表示从消息处理中返回,而不是一个新消息。为了画图清晰,经常将返回消息省略掉。

从图8.1还可以看出,一般的对象放在图的顶部,还有一种特殊的消息new是创建一个对象消息,因此由于该消息而创建的对象放在图中中间位置合适的地方。

在面向对象程序设计中,总体的控制流程往往是最以理解的。很一个好的设计应当将很多小方法放入不同的类中,并且随时能巧妙的指出总体的行为顺序。这样可以十分有效地帮助你加速了解**。

对于首次接触面向对象程序设计的人来说尤其是如此,顺序图可以帮助你看清行为的次序。

并发过程和激活。

对于并发过程,顺序图也是很有用的。图8.2显示了一些检查银行交易的对象。

在交易出现的同时,它创建了一个交易协调人负责协调交易的审查。协调人创建了一定数量(本例中是2个)的交易审查员对象,每个审查员对象负责一项特定的审查。在这种并发的工作模式下,很容易增加新的审查过程,因为每个审查员无须同时开始工作(异步方式),而整个过程却是平行展开的。

图3-34 并发过程和激活。

一个交易审查员对象在完成它的工作后,将通知交易协调人。协调人检查是否所有审查都执行完毕:如果所有审查均以完成并且通过,则协调人通知交易对象审查获得通过;否则协调人不作其他任何工作,而仅仅在等待他所激活但尚未完成审查的交易原来向他汇报工作。

在图8.2所描述的顺序图中引入了一些新的元素,其中一个称为激活。当一个对象的某个方法正在执行中或者正在等待一个子过程的返回时,则称该状态处于激活状态;当一个对象接收到一条消息后启动了某个活动,则称为激活,即这个对象被激活。

激活用生命线上一个细长的矩形框表示。许多设计者喜欢使用过多的激活,实际上激活的概念在串行执行过程中并不是很必要的,通常只在并行过程中使用激活。

一个调用程序不会因其发出的异步消息而停止不动,它可以继续执行自己的过程。一个异步消息可以用于以下三种目的:

1) 产生新线程。这种情况下,箭头指向激活符号的顶端。

2) 产生一个新对象。

3) 与正在运行线程通信。

对象的删除用一个大x表示。如图8.2所示,当大x没有其他消息触发时,表示对象自行删除。

如图8.3所时,当最后一个对象的大x由其他消息触发时,表示该对象被其他对象发出的消息删除。

图3-36顺序图:审查失败。

引入激活机制有助于更清楚地显示回授的各种作用。没有这种激活机制,或者没有这里使用的关于激活的栈式表示法,将很难说清楚回授之后进一步的调用将发生在**,应该在调用方法中还是在被调用的方法中。这种栈激活机制为此提供了清晰的表达方式。

正因为这种特点,有时在过程型的交互处理中也会利用这种激活机制。

图8.2和图8.3显示了关于交易审查用例的两个情节。

尽管uml 中提供了一种方法,是我们可以把这种条件逻辑合并在一张图中,即在一张图中同时表现多个情节,但是这里还是分别用了两张图来描述这种情节。采用合并的做法未必清晰,有时甚至会使图变得过于复杂。在图8.

3中,我们还是用了一种非常有用的技术,即在顺序图的左边加注一些文字说明,用来描述所发生的事件。将这些文字与图中的消息联系起来,有助于理解该图。这些内容应当成为正式文档的内容,而不仅仅是在黑板上随意涂抹的草图。

交互图的第二种形式是协作图。协作图也是用来描述对象与对象之间的消息连结关系的,但是它更侧重于说明哪些对象之间有消息传递,而不像顺序图那样侧重于在某种特定的情形下对象之间传递消息的时序性。在协作图中,对象同样是用一个对象图符号来表示,箭头表示消息发送的方向,而消息的执行顺序则由消息的编号来标明。

图3-37 简单编号方案的协作图。

与顺序图中从上而下的生命线相比,通过编号来看消息执行的时间顺序显然要困难的多。但是,协作图中对象间灵活的空间布局使我们可以更方便的展示另外一些有用信息,例如,更易于显示对象之间的动态连结关系。

协作图中消息执行顺序的编号方案有很多,可以自行挑选,但最常用的是以下两种方案:图8.4使用的是最简单的一种编号方案,从1开始,由小到达顺序排列;而图8.

5使用的则是一种小数点制编号方案,其中整数位常常用来表示模块号。

不少人喜欢使用简单的编号方案。但是,为了使操作之间相互调用关系更加清楚,uml使用了小数点方案。虽然消息执行的全局顺序已经不是协作图所要说明的重点,但是,不管使用什么编号方案,顺序图中展示的各种控制信息还是应当加到协作图上。

不同的软件工程师可能偏好不同形式的交互图。例如:有些人喜欢使用顺序图,因为顺序图突出使用执行的时序,能更方便地看出事情发生的次序。

也有些人更喜欢协作图,因为协作图的布局方法能更清楚的表示出对象之间静态的连结关系。那么如何选择呢?一个最基本的原则是用哪种图更简明清楚则选用哪种图。

总的来讲,交互图能清楚的显示消息机制。然而,当消息中有太多的条件或循环时,交互图就失去其简明性。交互图仅适用于条件判断和循环不太多的时序过程,一旦条件判断或循环太多,交互图就不太实用了。

当带有很多条件行为时,应当采用什么方法来表示呢?由两个不同的思路,一个是对每个判断都单独绘一个图,另一个是用带条件判断的消息表示。一般来讲,前者更加简明。

当行为比较简单时,交互图是最好的图。但是当行为变得比较复杂时,交互图就迅速失去其清晰度。如果想在一张图中表示复杂的行为,则应当使用活**。

如果要描述在一个用例中的几个对象协同工作的行为,交互图是一种有力的工具。交互图擅长显示对象之间的合作关系,尽管它并不对这些对象的行为进行精确定义。

如果想描述跨越多个用例的单个对象的行为,应当使用状态图。如果想描述跨越多个用例或多个线程的复杂行为,则需要考虑使用活**。

状态图(state diagram)用来描述一个特定对象的所有可能状态及其引起状态转移的事件。大多数面向对象技术都用状态图表示单个对象在其生命周期中的行为。一个状态图包括一系列的状态以及状态之间的转移。

所有对象都具有状态,状态是对象执行了一系列活动的结果。当某些事情发生后,对象的状态将发生变化,我们称改变对象状态的事情为“事件”,状态图用来显示对象对事件的反应以及对象状态的改变。状态图中定义的状态有:

初态、终态、中间状态、复合状态。其中,初态是状态图的起始点,而终态则是状态图的终点。一个状态图只能有一个初态,而终态则可以有多个。

初态用一个黑圆点表示,终点用黑圆点外加一个圆表示(很像一只牛眼)。状态图中的状态用一个圆角四边形表示。状态之间为状态转换,用一条带箭头的线表示。

引起状态转换的事件可以状态转换线旁边的标签表示。当事件发生时,状态转换开始。

一个状态一般包含三个部分,如下图所示,第一部分为状态的名称,第二部分为可选的状态变量的变量名和变量值。变量(属性)至状态图中类的属性。第三部分为可选的活动表,列出有关事件和活动。

在活动表中,常常使用下面三种标准事件:进入、退出、做(do)。进入事件用来指定进入一个状态时的活动,退出事件用来指定退出一个状态的活动,做事件用来指定在该状态下的活动。

活动部分的语法如下:

事件参数表 / 活动表达式。

事件可以是任何事件,包括上述三种标准事件。活动表达式用来指定应该进行何种活动。有时还需要为事件指定一些参数。

第三章主要施工方法

第三章主要施工方法与技术措施。第一节工程总施工顺序。土福湾供水工程第四标段施工顺序 a干管k10 381.611 k13 497.557 第二节测量放线。为保证工程各结构物平面位置的放样及高程准确,根据工程特点拟采用如下测量方案。一 测量工作的重要性及要求 测量工作必须要走在各项工作的前面。提前施工...

计算方法第三章作业

3.证明方程。在上有一实根,并用二分法求这个根。要求。请给出程序和运行结果。4.用newton迭代法求方程。的一个正根,计算结果精确到7位有效数字。要求给出程序和运行结果。5.用牛顿迭代法求方程在附近的根。要求给出程序和运行结果。6.证明迭代格式。是计算的三阶方法。7.用newton迭代法求方程。在...

第三章作业

v s 顺序执行下述两个动作 1.s值加1,即s s 1 2.如果s 0,则该进程继续运行 3.如果s 0,则唤醒等待信号量s阻塞队列中的头一个进程 把阻塞态改为就绪态 执行v操作的进程继续运行。procedure s var s semaphore begin s s 1 if s 0 then ...