UML 关系类型:关联、依赖、泛化
什么是 UML 关系?
UML 中的关系用于表示结构、行为或分组事物之间的连接。它也称为链接,用于描述系统执行期间两个或多个事物如何相互关联。UML 关系类型包括关联、依赖、泛化和实现。
让我们详细研究一下
UML 类图关系类型
关联
它是一组连接 UML 模型元素的链接。它还定义了有多少对象参与该关系。
依赖性
在依赖关系中,顾名思义,两个或多个元素相互依赖。在这种关系中,如果我们对特定元素进行更改,则其他所有元素都很可能受到更改的影响。
泛化
它也称为父子关系。在泛化中,一个元素是另一个通用组件的特化。它可以被替换。它主要用于表示继承。
实现
在 UML 的实现关系中,一个实体表示一些不由其自身实现的职责,而另一个实体则实现这些职责。这种关系主要在接口的情况下发现。
关联
它是一种结构关系,表示对象可以在系统中与其他对象关联或连接。可以对关联关系应用以下约束。
- {隐式} – 隐式约束指定关系不是显式的;它是基于概念的。
- {有序} – 有序约束指定关联一端的一组对象以特定方式排列。
- {可变} – 可变约束指定系统中各种对象之间的连接可以根据需要添加、删除和修改。
- {仅添加} – 它指定可以从位于关联另一端的一个对象添加新连接。
- {冻结} – 它指定当在两个对象之间添加链接时,在给定链接或连接上激活冻结约束期间,该链接不能被修改。
我们还可以创建一个具有关联属性的类,称为关联类。
自关联
自关联是 UML 中关联关系的一个子类型。在自关联中,同一类的实例可以相互关联。一个类的实例也被称为对象。
自关联规定,同一类的对象之间可以存在链接或连接。
让我们以一个水果类为例。水果类有两个实例,如芒果和苹果。自关联规定,芒果和苹果之间可以存在链接,因为它们是水果等同一类的实例。
定向关联
顾名思义,定向关联与关联类中的流程方向有关。
在定向关联中,流程是定向的。从一个类到另一个类的关联只沿一个方向流动。
它用带箭头的实线表示。
示例
您可以说服务器和客户端之间存在定向关联关系。服务器可以处理客户端的请求。这种流是单向的,只从服务器流向客户端。因此,系统中的服务器和客户端之间可以存在定向关联关系。
依赖性
使用 UML 中的依赖关系,可以说明特定系统内的各种事物如何相互依赖。依赖用于描述 UML 中相互依赖的各种元素之间的关系。
元模型
- «bind» – Bind 是一个约束,它指定源可以在目标位置初始化模板,使用提供的参数或值。
- «derive» – 它表示源对象的位置可以从目标对象计算得出。
- «friend» – 它指定源在目标对象中具有唯一的可见性。
- «instanceOf» – 它指定目标分类器的实例是源对象。
- «instantiate» – 它指定源对象能够创建目标对象的实例。
- «refine» – 它指定源对象比目标对象具有更好的抽象。
- «use» – 它用于在 UML 中创建包。use 元模型描述了源包的元素也可以存在于目标包中。它描述了源包使用了目标包的某些元素。
- «substitute» – 指定客户端可以在运行时替换供应商。
- «access» – 它指定源包访问目标包的元素,这也称为私有合并。
- «import» – 它指定目标可以导入源包的元素,就好像它们是在目标中定义的,这也称为公共合并。
- «permit» – 指定源元素可以根据供应商声明的可见性访问供应商元素。
- «extend» – 帮助您指定目标可以扩展源元素的功能。
- «include» – 允许您指定源元素可以在指定位置包含另一个元素的功能。(与 c/c++ 中的函数调用相同)
- «become» – 它指定目标与源相似,但具有不同的值和角色。
- «call» – 它指定源可以调用目标对象的函数。
- «copy» – 它指定目标对象是源对象的独立副本。
- «parameter» – 供应商是客户端操作的参数。
- «send» – 客户端是向供应商发送某个未指定目标的运算符。
状态机之间的元模型
- «send» – 指定源操作发送目标事件。
泛化
这是普通实体和系统中存在的唯一实体之间的关系。
在泛化关系中,可以实现称为继承的面向对象概念。泛化关系存在于两个对象之间,也称为实体或事物。在泛化关系中,一个实体是父实体,另一个是子实体。这些实体可以使用继承来表示。
在继承中,任何父类的子类都可以访问、更新或继承父对象中指定的函数。子对象可以添加自己的功能,也可以继承父对象的结构和行为。
这种类型的关系统称为泛化关系。
元模型及其约束
- «implementation» – 此元模型用于表示子实体通过继承父对象的结构和行为来由父实体实现,而不会违反规则。注意此元模型在单一继承中被广泛使用。
泛化关系包含完整、不完整等约束,用于检查所有子实体是否包含在关系中。
实现
在 UML 的实现关系中,一个实体表示一些不由其自身实现的职责,而另一个实体则实现这些职责。这种关系主要在接口的情况下发现。
实现可以有两种方式表示
- 使用标准形式
- 使用省略形式
在上面的图中,账户业务规则实现了 IRuleAgent 接口。
实现类型
- 标准形式 在 UML 的实现关系中,标准形式用于实现跨系统的接口。它使用接口元模型创建接口,并使用实现关系来实现特定接口。在标准形式中,实现关系用带有大开口箭头的虚线定向线表示。在上面的图中,接口 Iruleagent 是通过一个名为 Account Business Rules 的对象实现的。
- 省略形式 UML 类图中的实现也可以通过省略形式显示。在省略形式中,接口用圆表示,也称为棒棒糖符号。当通过系统内的任何东西实现此接口时,会创建一个省略结构。在上面的图中,接口 Iruleagent 用省略形式表示,它由 acctrule.dll 实现。
组合
它不是标准的 UML 关系,但在各种应用程序中仍在使用。
组合聚合是聚合关系的一个子类型,具有以下特征:
- 它是对象之间的双向关联。
- 它是一种整体/部分关系。
- 如果删除了组合,则与之关联的所有其他部分也会被删除。
组合聚合被描述为在聚合(整体)端带有实心黑色菱形的二元关联。
文件夹是一种包含 n 个文件的结构。文件夹用于在其内部存储文件。每个文件夹可以与任意数量的文件关联。在计算机系统中,每个文件至少是一个文件组织系统内某个文件夹的一部分。同一个文件也可以是另一个文件夹的一部分,但并非强制要求。当一个文件从文件夹中删除时,文件夹保持不受影响,而与该特定文件相关的数据被销毁。如果对文件夹执行删除操作,它也会影响文件夹内存在的所有文件。一旦文件夹从系统中移除,与之关联的所有文件都会被自动销毁。
UML 中这种类型的关系称为组合聚合关系。
聚合
聚合是 UML 中关联关系的一个子类型。聚合和组合都是 UML 中关联关系的类型。聚合关系可以用简单的话来说是“一个类的对象可以拥有或访问另一个类的对象”。
在聚合关系中,即使源对象被销毁,依赖对象也保留在关系的作用域内。
让我们以汽车和车轮为例。汽车需要车轮才能正常运行,但车轮并不总是需要汽车。它也可以与其他自行车、助力车或其他车辆一起使用,但不与特定汽车一起使用。在这里,即使没有汽车对象,车轮对象也是有意义的。这种类型的关系称为聚合关系。
摘要
- UML 中的关系允许事物与系统内的其他事物相关联。
- UML 定义了关联、依赖、泛化和实现关系。
- 组合关系也可以用来表示对象一次只能是单个组合的一部分。
- 关联用于描述一个对象可以与另一个对象关联。
- 依赖表示对象可以相互依赖。
- 实现是分类器之间有意义的关系。
- 泛化也称为父子关系。