泛化与类的泛化意义相同,表达用例之间存在“is-a-kind-of”关系。当一组用例拥有相同的事件流序列,或者相似的一组约束的时候,可以使用例的泛化。一般父用例是抽象的,而子用例将继承父用例的特性。比如“预定房间”或者“预定早餐”还可以有一套相同的其它服务的时候,可以使用泛化描述。
在“预定服务”用例中有一个抽象子事件流,所以“预定房间”是一个抽象用例,而“选择服务”的事件实现在“预定房间”用例中。事件流执行的规则如下:实例化首先出现在子用例中,沿着基本事件流运行,如果子用例没有定义基本事件流,则沿着父基本事件流执行,上面的例子由于没有定义子基本事件流,所以沿着父基本事件流运行。在运行到“选择一项服务”的时候,执行子用例定义的“选择服务”子用例,如下图所示。
事件流的描述如下:
要注意到的问题是,首先不要混淆泛化和扩展,Java中的关键字 extend 是泛化而非扩展,而用例中的扩展与泛化是完全不同的,扩展事件流只不过是挂接到原有用例事件流的某个位置上,以添加新的行为,而且是在同一层及解决问题。另一个方面不能混淆泛化和包含,泛化和包含都是用于抽取用例的公共行为,因此容易混淆,其实它们是实现复用的两种不同手段,泛化关系要求付用例和子用例之间拥有“is-a -kind-of”关系,这样继承才有意义,但包含无需拥有这种关系。在使用包含的时候,当执行到使用公共行为的步骤时,必须明确指出包含的用例,而且指明使用哪个事件流。
相关文章:软件架构设计的思想与模式[4]