4.时序图sequence diagram
交互图interaction diagram描述了成群的对象如何以某种行为合作,其中最重要的是时序图sequence diagram。
典型的,一个时序图捕捉一单个情景的行为。图显示了一些示例对象以及这个用例里这些对象间传递的信息the messages that are passed between these objects within the use case
考虑一个简单的情景。我们有一个订单order,要用一个命令command来计算其价格。需要看订单上所有的行项目line items,并决定其价格,基于订单行产品的价格规则。处理完所有的行项目后,需要计算一个总和的折扣discount,基于跟客户相关的规则。
两种交互的不同:4.1是集中控制centralized control(一个参与者完成所有处理,其他参与者提供数据),4.2是分布控制distributed control(处理被分散到很多参与者,每个只做算法的一点点)
我更喜欢分布控制。好的设计的一个主要目标是将改变产生的效果局部化localize the effects of change。数据和访问数据的行为经常一起改变。所以将数据和使用它的行为放在一起是面向对象设计的第一条规则。
更多的,通过分布控制,你提高更多机会来使用多态而不是条件判断。
procedure dispatch
foreach (lineitem)
if (product.value > $10K)
carefule.dispatch
else
regular.dispatch
end if
end for
if (needsConfirmation) messenger.confirm
end procedure
一般,框由一个时序图拆分的片段fragment的一些区域region组成。每个框有一个操作者operator,每个片段有一个守卫guard。显示一个循环,你用loop操作符和一个片段,并在守卫里放迭代的基础the basis of the iteration([for each line item])。对于条件逻辑,你可用alt操作符,并在各片段放一个条件。只有guard是true的片段才会执行。如果你只有一个区域region,有一个opt操作符。
uml1中使用迭代标记iteration marker和守卫guard。一个迭代标记是一个*加到消息名去。你可以添加一些文字到中括号去来表示迭代的基础(比如*[for each line item])。守卫是放到中括号里去的一个条件表达式(如[value > $10000]),表示只有守卫是真才会发送消息。在uml2中他们从时序图中移除,但在交流图中合法communication diagram。