| 本文讨论的是一种UML图——交互图(Interaction Diagram)。交互图描述的是一组对象之间的交互过程,或者说,这里我们实际上要回答这样一个问题:“方法调用过程在UML中怎样表示?” UML交互图本文将通过一个非常简单的交易系统来说明UML交互图。这个系统包含六个Java类。从前面几篇文章中,我们已经知道UML类图是分析Java程序结构的有效方法,图一显示了这个交易和支付系统的类图。为了更清楚地说明各个类的职能和角色,图一利用了前面介绍过的彩色类原型表示法。

图一 一个简单交易系统的UML类图
如果我们跟踪任意一个Java程序的执行过程,就会发现,这个过程包含了一个或者多个对类和对象的方法调用。我们通过调用对象的方法来寻求特定问题的答案或执行一个特定的动作。很多时候,被调用的方法还会调用其他方法——或者是同一对象的方法,或者是同一类的其他对象的方法,或者是其他类的对象的方法。类似地,这些被调用的方法又会继续调用其他方法,直至问题得到了明确的答案或动作全部执行完毕(或者出现异常,这时问题将没有答案或动作不能完成)。 UML交互图以图形的形式表示出方法调用过程,它有两种形式:序列图(Sequence Diagram)和协作图(Collaboration Diagram)。 序列图
要达到某个特定的目标,必然要执行一系列的方法调用。UML序列图的典型用途就是显示出方法调用过程。图二显示了一个交易事务中计算累计金额的序列图,调用从Sale类的calcTotal()方法开始,相关的代码片断在序列图之后给出。 术语说明:UML把操作(Operation)定义为方法的特征(Signature)。“方法”(Method)这一术语被保留给实现操作的代码。但在Java环境中,“方法”这一术语的应用范围更广泛一些。在UML序列图中,调用一个操作就叫做发送一个消息(Message)。序列图实际上阐述了操作的具体实现,所以下面我们会较多地用到“方法”这个术语(偶尔也会用到“消息”这个术语)。
图二 计算交易总金额的序列图
/** 属于Sale类:
* 从lineItem的单项金额计算交易总金额
* @return 交易总额 */
public double calcTotal() {
total = 0.0;
Iterator i = lineItems.iterator();
while (i.hasNext()) total += ((LineItem)i.next()).calcTotal();
return total;
}
/** 属于LineItem类:
* 计算当前项目的交易金额
* @return 交易金额
*/
public double calcTotal() {
total = product.calcTotal(this);
return total;
}
/** 属于Product类:
* 计算指定数量的产品价值多少
* @return 金额
*/
public double calcTotal(LineItem li) {
return amount * li.getQuantity();
} |
方法的返回值可以通过虚线开叉箭头的形式表示,但这是可选的,例如图二中从:Sale指向Sender的箭头。
如果要在一个对象的集合上进行迭代操作,则在方法的名字前面加上一个星号(再在方括号里面说明循环条件,可选)。在图二中,Sale类对LineItem类对象的调用给出了迭代操作的一个例子。
[1] [2] 下一页
 【责编:landss】 |