UML的几种关系
UML中有四种可用的关系:
- 依赖(Dependency)
依赖是两个事物之间的关系,如果一个元素发生改变,这种改变还会影响到另一个。
依赖如何去表示?通常依赖表示一个类去使用另一个类。
这里A类使用B类,但是A类并没有持有B类的引用来作为A类自己的状态的一部分,这就意味着如果B类的接口发生改变那么这会影响到A类。通常A类会将B类的一个实例当做一个方法的参数来使用,或者创建栈上的局部变量来引用B类的一个实例(没有状态上的依赖)。
import B;
public class A {
public void method1(Bb) {
// . . .
}
public void method2() {
B tempDependency = new B();
// . . .
}
}
- 关联(Association)
关联基本上是一组连接UML模型元素的链接。 它还描述了有多少对象参与该关系。
关联定义了一种依赖,但是这种依赖性比上述所说的依赖关系更强,A1类用B1类作为关联,换句话讲,A1类使用并包含了B1类的一个实例,但是B1类并不知道或者使用A1类的实例。
import B1;
public class A1 {
private B1 b1;
public B1 getB1() {
return b1;
}
}
关联关系定义了所依赖类的一个实例来作为自己的状态,因此A1使用了B1的一个实例b1来作为自己的状态的一部分。
我们现在讨论状态的依赖,可能需要定义构成依赖对象状态的实例的生命周期,以及有多少个关联的类实例,这就要说明一下聚合和组合的构成。
- 聚合(Aggregation)
聚合描述了A1包含B1的一个实例来作为A1的状态一部分的关联关系,但是对于这个B1的实例可以在其它的聚集实例之间所共享。这就意味着,B1的实例可以和A1的实例有着不同的生命周期,如果A1被垃圾回收了,B1可以不被回收掉。(因为其它对象可以同时引用着B1)
- 组合(Composition)
组合也定义了一种关联关系,A1由B1组合,同时A1和B1的生命周期是一样的,与聚合不一样的是A1包含多个B1实例的引用,
import B1;
public class A1 {
private B1[] b1;
// . . .
public B1 getB1(int anIndex) {
return b1[anIndex];
}
}
- 泛化(Generalization )
泛化可以定义为将指定元素与通用元素连接的关系。 它基本上描述了面向对象中的继承关系。
import B2;
public class A2 extends B2 {
// . . .
}
- 实现(Realization)
实现可以定义为两个元素连接的关系。 一个元素描述了一些没有实现的功能,另一个实现它们。 这种关系在接口的情况下存在。
import B3;
public class A3 implements B3 {
// . . .
}
A3实现了接口B3
UML标记方式
- 类标记
– 最上面是类的名字
– 第二个部分是类的属性.
– 第三个部分用来描述类能够执行的操作
– 第四个部分用来展示其它额外的组件
- 对象标记
对象用和类一样的方式来表示,唯一不同的是名字下面有个下划线。