如何在 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 节。