UML 类图

[toc]

UML

类的 UML 画法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Person 
{
private String name = "Jack";

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

protected void playBasketball()
{
pass();
}

private void pass()
{

}
}

此类对应的 UML 为

该图分为三层:最顶层的为类名,中间层的为属性,最底层的为方法。

  • 属性的表示方式为:【可见性】【属性名称】:【类型】={缺省值,可选}
  • 方法的表示方式为:【可见性】【方法名称】(【参数列表】):【类型】
  • 可见性都是一样的,"-“表示 private、”+“表示 public、”#" 表示 protected。

类和类的关系

依赖关系 (Dependency)

依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数。

  • 在 UML 中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

依赖关系通常通过三种方式来实现:

  • 将一个类的对象作为另一个类中方法的参数.
  • 在一个类的方法中将另一个类的对象作为其对象的局部变量.
  • 在一个类的方法中调用另一个类的静态方法.
1
2
3
4
5
6
public class Person {
public void doSomething(){
Card card = new Card();//局部变量
....
}
}
1
2
3
4
5
public class Person {
public void doSomething(Card card){//方法参数
....
}
}
1
2
3
4
5
public class Person {
public void doSomething(){
int id = Card.getId();//静态方法调用
...
}

关联关系 (Association)

关联关系是类与类之间最常见的一种关系,它是一种结构化的关系,表示一类对象与另一类对象之间有联系。

  • 在 UML 类图中,用实线连接有关联关系的对象所对应的类。

关联关系分单向关联、双向关联、自关联。

  • 单向关联:单向关联指的是关联只有一个方向,比如顾客(Customer)拥有地址(Address)。
  • 双向关联关系:默认情况下的关联都是双向的,比如顾客(Customer)购买商品(Product),反之,卖出去的商品总是与某个顾客与之相关联,这就是双向关联。
  • 自关联:指的就是对象中的属性为对象本身,这在链表中非常常见,单向链表 Node 中会维护一个它的前驱 Node,双向链表 Node 中会维护一个它的前驱 Node 和一个它的后继 Node。

聚合关系 (Aggregation)

聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中,成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。

  • 在 UML 中,聚合关系用带空心菱形的直线表示。

代码实现聚合关系,成员对象通常以构造方法、Setter 方法的方式注入到整体对象之中。

组合关系 (Composition)

组合关系也表示的是一种整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系。

  • 在 UML 中组合关系用带实心菱形的直线表示。

代码实现组合关系,通常在整体类的构造方法中直接实例化成员类,这是因为组合关系的整体和部分是共生关系。

和聚合关系相比,如果通过外部注入,那么即使整体不存在,那么部分还是存在的,这就相当于变成了一种聚合关系。

继承关系 (Inheritance)

类实现接口,类继承抽象类,类继承父类都属于这种关系。

实现(Realization)

在接口中通常没有属性,而且所有的操作都是抽象的,只有操作的声明没有操作的实现。

  • 在 UML 中,实现关系用带空心三角形的实线来表示。

类实现接口属于这种关系

泛化(Generalization)

泛化也叫作继承,用于描述父子类之间的关系,父类又称为基类,子类又称作派生类。

  • 在 UML 中,泛化关系用带空心三角形的实线来表示。

关联关系、聚合关系、组合关系之间的区别

  1. 关联和聚合的区别主要在于语义上:关联的两个对象之间一般是平等的,聚合则一般是不平等的。
  2. 聚合和组合的区别则在语义和实现上都有差别:组合的两个对象之间生命周期有很大的关联,被组合的对象在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁,一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象;聚合则不一样,被聚合的对象可以属于多个聚合对象。

绘制 UML 工具

Ubuntu

Dia is an editor for diagrams, graphs, charts etc. There is support for UML static structure diagrams (class diagrams), Entity-Relationship diagrams, network diagrams and much more. Diagrams can be exported to postscript and many other formats.

Dia 是可视化的图形化界面,可以在 Linux 环境下绘制 UML 类图,普通功能免费,可以满足正常的使用。

1
sudo apt install dia

References