UML

  类图用于描述系统中所包含的类以及它asd们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。

1.类

例如定义一个Person类,他包含属性name、age,以及操作getName()。
具体代码如下:

1
2
3
4
5
6
7
8
9
10
public class Person {

private String name;
private int age;

public String getName() {
return name;
}

}

在UML类图中,类一般由三部分组成:

1.类名

每个类都必须有一个名字,类名是一个字符串。就如上面代码中的Person

2.类的属性

属性是指类的性质,即类的成员变量。一个类可以有任意多个属性,也可以没有属性。
UML规定属性的表示方式为:

1
可见性  名称:类型 [ = 缺省值 ]

可见性:表示该属性对于类外的元素而言是否可见。
类图中表示形式为:
| 可见性 | UML图中表示形式 |
| :-: | :-: |
| public | + |
| private | - |
| protected | #
名称:属性的名称,用一个字符串表示。
类型:属性的数据类型,可以是基本数据类型,也可以是用户自定义类型。
缺省值:一个可选项,即属性的初始值。

3.类的操作

操作是类的任意一个实例对象都可以使用的行为,是类的成员方法。
UML规定操作的表示方式为:

1
可见性  名称(参数列表) [ : 返回类型]

可见性:与属性的可见性定义相同。
名称:方法名,用一个字符串表示。
参数列表:方法的参数,其语法与属性的定义相似,参数个数是任意的,多个参数之间用逗号隔开。
返回类型:一个可选项,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void),如果是构造方法,则无返回类型。
那么初始给定代码的类图可以表示为:

2.类与类之间的关系

1.关联关系

简单来说,关联关系就是如果类A的属性中包含了类B,那么A和B就具有关联关系。A和B可以相同。
一组具有关联关系的类的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public calss Family {

private Person father;
private Person mother;
private Person child;

}

public class Person {

private String name;
private int age;

}

从上面的代码中可以看到,Family类的属性都是用Person类来表示的,那么这两个类就具有关联关系.
用UML来表示就为:

如果Family类和Person类中互相包含,也就是说,如果Person类中的属性也有用Family类型表示的,那么这两个类间可以直接用一条没有箭头的实线相连。
如果Family类中包含了Family的属性,那么可以直接引一条指向自己的箭头。

聚合关系

聚合关系是一种比较特殊的关联关系。
可以看到,在之前的关联关系中,成员变量都是作为了整体变量的一部分,但在聚合关系中,成员对象可以脱离整体对象独立存在。
例如:汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,因此,汽车和发动机是聚合关系。
代码实现聚合关系时,成员对象通常作为构造方法、Setter方法或业务方法的参数注入到整体对象中。
具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Car {
private Engine engine;

public Car(Engine engine) {
this.engine = engine;
}

public void setEngine(Engine engine) {
this.engine = engine;
}

}

public class Engine {
……
}

这种关系的UML图表示如下:

组合关系

组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。
例如:人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,因此头和嘴巴是组合关系。
在代码实现组合关系时,通常在整体类的构造方法中直接实例化成员类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Head {

private Mouth mouth;

public Head() {
mouth = new Mouth();
}

...
}

public class Mouth {
...
}

这种关系的UML图表示如下:

2.依赖关系

依赖关系简单来说,就是某个类的方法使用另一个类的对象作为参数。
例如:驾驶员开车,在Driver类的drive()方法中将Car类型的对象car作为一个参数传递,以便在drive()方法中能够调用car的move()方法,且驾驶员的drive()方法依赖车的move()方法,因此类Driver依赖类Car。
在系统实施阶段,依赖关系通常通过三种方式来实现,第一种也是最常用的一种方式是将一个类的对象作为另一个类中方法的参数,第二种方式是在一个类的方法中将另一个类的对象作为其局部变量,第三种方式是在一个类的方法中调用另一个类的静态方法。
下面给出第一种方式的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Driver {

public void drive(Car car) {
car.move();
}

...
}

public class Car {

public void move() {
...
}

...
}

这种关系的UML图表示如下:

3.泛化关系

泛化关系也就是继承关系,用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。
例如对于如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//父类
public calss Person {

protected String name;
protected int age;

public void move() {
...
}

public void say() {
...
}

}

//子类
public class Student extends Person {

private String student;

public void study() {
...
}

}

//子类
public calss Teacher extends Person {

private String teacher;

public void teach() {
...
}

}

这种关系的UML图表示如下:

4.接口与实现关系

例如对于如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface Vehicle {

public void move();

}

public calss Ship implements Vehicle {

@Override
public void move() {
...
}

}

public class Car implements Vehicle {

@Override
public void move() {
...
}

}

这种关系的UML图表示如下:

本篇文章参考这里