在UML中,关系是非常重要的语义,它抽象出对象之间的联系,让对象构成某个特定的结构。
关联关系 association
关联关系是用一条直线表示。描述不同类的对象之间的结构关系。可以使用关联关系表示一个对象了解其他对象,即一个对象“知道”另一个对象的存在。例如A对象保存了B对象的ID,因此A对象“知道”B对象的存在。
如果A和B对象互相“知道”,则使用一条直线来表示关联关系;如果A知道B,而B不知道A,则使用一条带箭头的直线,由A指向B。
依赖关系 dependency
依赖关系是用一条带箭头的虚线表示的。描述一个对象的修改会导致另一个对象的修改的关系。与关联关系不同的是,依赖关系除了“知道”其他对象的存在,还会“使用”其他对象的属性或方法。从这个角度讲,依赖是一种特殊的关联关系。
扩展关系 extends
扩展关系是用一条带箭头的虚线加版型<<extends>>来表示的。它特别用在用例模型中说明向基本用例中的某个扩展点插入扩展用用例。
严格来说,扩展用例应当在概念用例模型中,通过分析业务用例场景抽象出关键的可选核心业务而形成扩展用例。不过,在业务模型当中使用也是可以接受的,可以更显示表示出一个复杂业务用例的各个分支。
例如:在打电话时,如果在通话过程中,收到另一个呼叫,我们可以将当前通话保留,而接听另一个通话。在这个场景中,保留通话用例就是打电话用例的一个扩展用例。这里可以看到,是否需要保留通话,取决于打电话人的决定,而不是必需,即使没有使用保留通话功能,也不影响打电话的完整性。但是如果没有之前的打电话用例,也就不可能单独启动保留通话用例了。
包含关系 include
包含关系是用一条带箭头的虚线加版型<<include>>来表示的。特别用于用例模型,说明在执行基本用例的过程中插入的行为段。
包含用例总是带有抽象性质的。基本用例可控制与包含用例的关系,并可依赖于执行包含用例的结果,但基本用例和包含用例都不能访问对方的属性。
包含用例是被封装的,它代表可在各种不同基本用例中复用的行为。
与扩展用例不同的是,包含用例表示的是“必需”而不是“可选”,如果没有包含用例,基本用例是不完整的。
例如:去银行办理业务,不论是取钱、转账还是修改密码。首先需要核对账号和密码,因此可以将核对账号作为上述业务用例的共有行为提取出来,形成一个包含用例。
实现关系 realize
实现关系是用一条带空心箭头的虚线表示的。特别用于在用例模型中连接用例和用例实现。
实现代表基本用例业务目标的可能的实现途径。例如,交电话费的业务用例中,交电话费是一个业务目标,其实现途径可能有营业厅交费、银行交费、预存话费等,每个用例实现都是同一业务目标的不同实现过程。
精化关系 refine
精化关系是用一条带箭头加版型<<refine>>来表示的。一个基本用例可以分解出许多更小的关键精化用例,这些精化用例更细致地展示了基本用例的核心业务。
与泛化关系不同的是,精化关系表示由基本对象可以分解为更明确、精细的子对象,这些子对象并没有增加、减少、改变基本对象的行为和属性,仅仅是更加细致和明确化。
例如:预存话费业务用例被精化成了四个核心的概念用例(开立账户、存入现金、转账、支付划账),这些概念用例合在一起就满足了实现业务目标的所有关键过程。我们可以根据这些精化结果建立业务框架。
泛化关系 generalization
泛化关系是用一条带空心箭头的直线表示的。泛化关系可用于建模过程中的任意一个阶段,说明两个对象之间的继承关系。
聚合关系 aggregation
聚合关系是用一条带空心菱形箭头的直线表示的。用于类图,表示实体对象之间的关系,表达整体由部分构成的语义。与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在。
组合关系 composition
组合关系是用一条带实心菱形箭头的直线表示的。