概念
类图和时序图之间的交互是通过消息,即成员函数的调用体现的。但要遵循一定的原则,可参见:
面向对象原则之一,面相对象原则之二。
例子
一个电子商务系统,会员可通过电子商务系统购买零件。具体功能需求如下:
会员请求结账时,系统验证会员的账户是否处于登录状态;系统验证订单是否完整以及各零件库存是否充足;最后,系统合计订单总价(订单总价=所有订单项价钱合计+税金+运费);
类图和时序图
消息传递
以检查库存为例,检查库存()消息应该发送给库存,对吧?但为什么先发送给订单了?这是因为类图中类的交互有一条路径:订单->订单项->零件->库存。也就是说,要检查的库存,是零件的库存,而零件又是指订单项里的零件,订单项又是订单的,所以消息传递要先传递给订单,再通过这个路径发送到库存。
相应的代码如下:
订单::检查库存(int N)//N是所需数量{订单项.检查库存(N);}订单项::检查库存(int N)//N是所需数量{零件.检查库存(N);}零件::检查库存(int N)//N是所需数量{库存.检查库存(N);}库存::检查库存(int N)//N是所需数量{......if (库存数量>N)//访问库存对象中的库存数量}
说明
- 代码中可以看出,除了库存类中的检查库存()函数是真的在检查库存,其他检查库存,只是“把活交给别人去做”,因为要访问的属性在库存里,所以只能库存类中的函数去做;
- MVC设计模式下,界面类和控制器类发出的消息源,可以简单认为是界面上用户触发的某些操作;
- 11号消息,结账(),调用了两个函数:合计总价(),计算附加费(),在同一个控制焦点上,表明这两个函数要在同一个函数中被调用,不能分开调用。
看得出,用UML设计的人,必须是代码能力过硬才能设计的周全。