Fork me on GitHub

UML 类图

UML 类图

类的图示(Class)

Java 类图

类图分三层

  1. 类的名称,如果是抽象类就用斜体显示。
  2. 类的特性,通常是字段和属性。
  3. 类的操作,通常是方法或行为。

Java 四种访问权限在类图中的表示

访问范围由大到小为:public、protected、default(即什么都不写)、private;‘+’表示 public,‘#’表示 protected,‘-’表示 private,什么都不写就表示 default 了。

分析图 1-1 Person 类图

第一行:类的名称为:Person;如果为抽象类,则“Person”采用斜体。
第二行:类的属性为:name ;“:”冒号前面表示属性的名字,后面表示属性的类型,还可以给属性赋初值。
第三行:类的方法:“<<Getter>>”或“<<Setter>>”表示方法的注释,可有可无,只是起到一个标记作用而已;冒号前面是方法的名字,注意方法的名字后面都是要带括号的“()”;冒号后面是方法的返回值。

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

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

接口的图示(interface)

接口的 UML 图有两种表示方法:
1、名称上面 <<interface>> 用这个标识它是一个接口
2、「棒棒糖」表示法,圆圈旁边为接口名称,接口方法在实现类中出现

UML 关系图

UML 类图

继承关系「即泛化关系」

继承关系用空心三角形 + 实线来表示
注意指向:子类指向父类(即空心三角形在父类这边)
助解:因为父类可以有多个子类,所以就会聚集成一个三角形,而子类则是一个线头的点

1
2
3
4
5
6
7
8
9
// 父类
public class Person {
private String name;
}

// 子类 继承了 父类
public class Student extends Person{
private String StudentNumber;
}

实现接口

实现接口用空心三角形 + 虚线来表示
注意指向:子类指向接口(即空心三角形在接口这边)
助解:因为接口可以有多个实现,所以也会聚集成一个三角形,而子类则是一个线头的点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 接口
public interface Say {
String say();
}

// 实现接口
public class Person implements Say{
private String name;

@Override
public String say() {
return "person say ...";
}
}

关联关系

关联关系表示一类对象与另一类对象之间有联系,通常将一个类的对象作为另一个类的成员变量来表示关联关系

关联关系用实线箭头表示
注意指向:箭头由引用类指向被引用类,表示引用类 要引用 被引用类的东西
助解:比如企鹅需要知道气候,而企鹅和气候是两个类,那么现在企鹅类中用到了气候类,所以企鹅依赖气候
因为企鹅需要知道气候的变化,即当一个类需要知道另一个类时,可以用关联关系
关联关系有:单向关联、双向关联、自身关联、多重性关联

1
2
3
4
5
6
7
8
9
// 气候类
public class Weather {
}

// 企鹅类
public class Penguin {
// 企鹅需要知道气候,所以这里引用了气候类,表示企鹅这个类引用了气候类,即一个类中有另一个类的引用
private Weather weather;
}

依赖关系

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

依赖关系用虚线箭头表示
注意指向:箭头由依赖方指向被被依赖方,表示依赖方 依赖于 被依赖方提供的东西
助解:动物生存依赖氧气、水,注意这里是动物的生存依赖氧气、水,不是动物本身依赖,动物要是挂了就不需要了

1
2
3
4
5
6
7
8
9
10
11
12
13
// 汽车类
public class Car {
public void move() {
System.out.println("move");
}
}

// Driver 类的方法使用了 Car 类对象作为方法的参数,即要想开车,必须先有车
public class Driver {
public void drive(Car car) {
car.move();
}
}

关联关系 vs 依赖关系

依赖关系:是一种 使用关系。一个类 A 使用到了另一个类 B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是 B 类的变化会影响到 A。例如:客户使用产品需要提供者,产品的变更会影响客户的使用,但一个客户需要的产品可以有多个提供者。即一个类可能同时依赖多个类。

关联关系:是一种 结构关系。它指明一个事物的对象与另一个事物的对象之间的联系。关联关系比依赖关系更强,不存在依赖关系的偶然性,关系也不是临时性的,而一般是长期性的。例如:商品和订单,订单中包含商品信息。

小结:

  • 依赖关系是一种 使用关系,即类 A 在做某个动作的时候依赖到了其他对象类 B。
  • 关联关系是一种 结构关系,即类 A 中存在类 B,指明了类 A 对象和 类 B 对象之间的联系。

聚合关系

聚合是一种弱的「拥有」关系,体现的是 A 对象可以包含 B 对象,但 B 对象不是 A 对象的一部分

聚合关系用空心的菱形 + 实线箭头表示
注意指向:空心的菱形放在聚合的群体那边,箭头指向群体中的每个个体
助解:大雁和雁群,因为大雁聚合形成雁群,则空心菱形表示聚合形成堆了,而箭头表示单个点

1
2
3
4
5
6
7
8
9
// 大雁
public class Goose {
}

// 雁群
public class GooseGroup {
// 雁群类中有大雁的集合
private Goose[] gooseList;
}

合成关系「即组合关系」

合成是一种强的「拥有」关系,提现了严格的部分和整体的关系,部分和整体的生命周期一样

合成关系用实心的菱形 + 实线箭头表示
注意指向:实心的菱形放在合成的整体那边,箭头指向部分,即用来合成整体的部件
助解:鸟和翅膀,部分和整体且生命周期一致

1
2
3
4
5
6
7
8
9
10
11
12
13
// 翅膀
public class Wing {
}

// 鸟类
public class Bird {
private Wing wing;

// 生成鸟类的同时生成翅膀
public Bird() {
this.wing = new Wing();
}
}

参考列表:
《大话设计模式》
[深入浅出UML类图]http://www.uml.org.cn/oobject/201211231.asp
[UML基础系列:类图]http://www.cnblogs.com/lsgxeva/p/7720224.html

感觉不错:
[Java类与类之间的5种关系及uml表示]https://blog.csdn.net/pj36536/article/details/53101764
[UML类图与类的关系详解]https://blog.csdn.net/sinat_30397435/article/details/79018467

-------------本文结束感谢您的阅读-------------

本文标题:UML 类图

文章作者:Yan ChongSheng

发布时间:2018年02月02日

最后更新:2018年10月17日

原始链接:yanchongsheng.github.io/2018/02/02/Design-Pattern-2018-02-02-UML类图/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

开启打赏模式