如何在 UML 中表示双向关联?
How to represent bi-directional associations in UML?
阅读问题“In UML class diagram can composition be bidirectional?”后,我想知道双向 shared/composite 聚合的具体示例在 UML 图上的外观如何。具体来说,我感兴趣的是如何使用箭头和多重性来区分以下情况:
1)单向共享聚合(聚合)
class Foo {
// Can contain 0+ elements
ArrayList<Bar> bars = new ArrayList<>();
void addBar(Bar bar) {
bars.add(bar);
}
}
class Bar {...}
2)双向共享聚合(聚合)
class Foo {
// Can contain 0+ elements
ArrayList<Bar> bars = new ArrayList<>();
void addBar(Bar bar) {
bars.add(bar);
bar.setFoo(this);
}
}
class Bar {
Foo foo;
void setFoo(Foo foo) {
this.foo = foo;
}
}
3)单向复合聚合(composition)
class Foo {
// Can contain 0+ elements
ArrayList<Bar> bars = new ArrayList<>();
void addBar() {
bars.add(new Bar());
}
}
class Bar {...}
4)双向复合聚合(composition)
class Foo {
// Can contain 0+ elements
ArrayList<Bar> bars = new ArrayList<>();
void addBar() {
bars.add(new Bar(this));
}
}
class Bar {
Bar foo;
Bar(Foo foo) {
this.foo = foo;
}
}
案例 1 和案例 2 应该很简单。我不确定如何表示双向关联,以及如何将它们与单向关联区分开来,因为两者在双方都有多重性。该图必须包含多重性。
箭头用于区分单向关联和双向关联。
- 单向关联有一个箭头。
- 双向关联有两个箭头,每边一个。
通常情况下,没有箭头的关联具有未指定的可导航性。但是允许这样的约定总是双向的。
要明确指出某个关联在某个方向不可导航,您可以在不可导航的一端显示一个十字,但这在实践中并不经常使用.
多重性和聚合类型与导航无关。
例如,您的最后一个案例可以建模如下:
有关更多示例,请参阅 UML 2.5 规范第 11.5.5 节。
阅读问题“In UML class diagram can composition be bidirectional?”后,我想知道双向 shared/composite 聚合的具体示例在 UML 图上的外观如何。具体来说,我感兴趣的是如何使用箭头和多重性来区分以下情况:
1)单向共享聚合(聚合)
class Foo {
// Can contain 0+ elements
ArrayList<Bar> bars = new ArrayList<>();
void addBar(Bar bar) {
bars.add(bar);
}
}
class Bar {...}
2)双向共享聚合(聚合)
class Foo {
// Can contain 0+ elements
ArrayList<Bar> bars = new ArrayList<>();
void addBar(Bar bar) {
bars.add(bar);
bar.setFoo(this);
}
}
class Bar {
Foo foo;
void setFoo(Foo foo) {
this.foo = foo;
}
}
3)单向复合聚合(composition)
class Foo {
// Can contain 0+ elements
ArrayList<Bar> bars = new ArrayList<>();
void addBar() {
bars.add(new Bar());
}
}
class Bar {...}
4)双向复合聚合(composition)
class Foo {
// Can contain 0+ elements
ArrayList<Bar> bars = new ArrayList<>();
void addBar() {
bars.add(new Bar(this));
}
}
class Bar {
Bar foo;
Bar(Foo foo) {
this.foo = foo;
}
}
案例 1 和案例 2 应该很简单。我不确定如何表示双向关联,以及如何将它们与单向关联区分开来,因为两者在双方都有多重性。该图必须包含多重性。
箭头用于区分单向关联和双向关联。
- 单向关联有一个箭头。
- 双向关联有两个箭头,每边一个。
通常情况下,没有箭头的关联具有未指定的可导航性。但是允许这样的约定总是双向的。
要明确指出某个关联在某个方向不可导航,您可以在不可导航的一端显示一个十字,但这在实践中并不经常使用.
多重性和聚合类型与导航无关。
例如,您的最后一个案例可以建模如下:
有关更多示例,请参阅 UML 2.5 规范第 11.5.5 节。