类图中的链接可以是以下之一:
- Association及其子类型Aggregation和Composition。
- 概括
- 实现
- 依赖
以上所有链接都反映在代码中。我将在java中给出一些示例:
关联
如果关联是单向的(链接有一个指向 B 的箭头),那么类 A 有一个类 B 的字段。
public class A {
B b;
}
如果关联是双向的(链接中没有箭头),那么 B 类也有 A 类的字段。
public class B {
A a;
}
概括
在这种情况下,A 继承了 B。
public class A extends B {
//class implementation
实现
在这种情况下B
,必须是一个接口,以及A
一个实现它的类。
public class A implements B {
//class implementation
依赖
在这种情况下,A 类依赖于 B 类。这是什么意思?这意味着B类以某种方式存在于A类的代码中。因此,如果A类和B类在不同的包中,则A的类文件中有B类的import语句
import somepackage.B;
public class A {
void someMethod() {
B b = ...
}
}
具体的图呢?
具体的图表没有指定关联的可导航性,即没有说明哪个类保持对另一个的引用。通常,当没有明确的可导航性规范时,会暗示双向关联。具有类之间双向关联的图转换为:
public class A {
B b;
public void doSomething(B obj) {
obj.operation1();
}
}
public class B {
A a;
public void operation1() {
//some code in here...
}
}
如果类 A 没有类 B 的字段,但它只在doSomething(b)
方法中使用 B 作为参数,则不存在关联,而是依赖。所以你应该用依赖链接替换关联链接,你的图表将是:
是否应该从图中省略依赖关系?
您不需要在 UML 图中显示两个类之间的每个链接。UML 是一种通信方式,因此您可以省略任何不会为正在通信的消息增加价值的内容。在具有更多类的更复杂的场景中,您很可能不想呈现一个类的所有依赖关系或关联,而只想呈现您认为重要的那些。否则图表会充满链接并且变得不可读。
因此,如果您认为 A 类对 B 类的依赖并不重要,您可以在图表中省略它(因为它也出现在doSomething(b)
方法的签名中。通常您不想展示每个编译图中的依赖关系,但更重要的是。
另一方面,如果这种关系是您想要传达的信息的一部分,那么您应该将它包含在图表中。在这种情况下,我发现用有意义的构造型来装饰依赖链接非常有用,它描述了依赖的类型。类似的东西<<invokes_operation1>>
会更具描述性,特别是如果operation1()
是 B 类功能的重要部分。