介绍
UML类图常用于描述面向对象语言中类的结构以及类与类之间关系。
1. 类的表示
类是具有相似结构、行为和关系的一组对象的描述符。类是面向对象语言中极为重要的结构。下图所示的就是类在UML类图中的表示。
从上往下被分为三层,依次为:类名、属性以及方法。
- 如果是接口,则类名采用斜体表示
- 属性以及方法前的符号代表可见性:
- “+”表示public
- “-”表示private
- “#”表示protected
- "~"表示default,也就是包权限
- “_”下划线表示static
- 斜体表示抽象
2. 类之间的关系
在面向对象语言中,类与类之间的关系是错综复杂的,接下来主要介绍几种常用的关系。
2.1 继承 (extend)
介绍:继承可以说是面向对象语言中极为重要的一种关系,它使得一个类可以继承另一个类的能力,并且可以修改或者新增一部分能力,一个类只可以继承一个类。
表示:空心三角 + 实线
案例:Student类继承了People类,新增了 studentId 属性 以及study 方法;同时由于可见性导致私有属性 age 以及私有方法 work 方法没有被继承,如下图:
2.2 实现 (implement)
介绍:实现与继承不同,实现某个接口主要是为了标识某个标记或者实现某个功能,同时一个类可以实现多个接口。
表示:空心三角 + 虚线
案例:Student类通过实现Swimmable接口具有了swim的能力,如下图:
2.3 依赖
介绍:某个对象的方法需要另一个对象的参与时,两者之间就体现为依赖关系。
表示:箭头 + 虚线
案例:People类的eat方法依赖Food类的参与,因此可以说People依赖Food,如下图:
3 graphviz的封装
Graphviz 是 AT&T 实验室开发的一个开源软件,它以一种文本语言去描述图(graph),然后自动排布节点和边去生成图片。我使用python对其进行了封装使其更方便复用且可读性好以方便自己画UML类图。
在2.3节中的UML类图便是采用下述代码生成的。
from Graph.GraphBuilder import GraphBuilder
from Graph.Enum import *
builder = GraphBuilder()
ReturnType.Balance = "Balance"
builder.create_node("People") \
.add_property(Modifier.private, "age", ReturnType.int) \
.add_property(Modifier.public, "name", ReturnType.String) \
.add_function(Modifier.public, "speak", ["text: String"], ReturnType.void) \
.add_function(Modifier.private, "work", [], ReturnType.Balance) \
.add_function(Modifier.public, "eat", ["food: Food"], ReturnType.void) \
.end()
builder.create_node("Swimmable", class_style=ClassStyle.interface) \
.add_function(Modifier.public, "swim", [], ReturnType.void) \
.end()
builder.create_node("Student") \
.add_property(Modifier.public, "name", ReturnType.String) \
.add_property(Modifier.public, "studentId", ReturnType.Long) \
.add_function(Modifier.public, "speak", ["text: String"], ReturnType.void) \
.add_function(Modifier.private, "study", [], ReturnType.void) \
.add_function(Modifier.public, "swim", [], ReturnType.void) \
.add_function(Modifier.public, "eat", ["food: Food"], ReturnType.void) \
.end()
builder.create_node("Food").end()
builder.create_edge("Student", "People", Relationship.extend) \
.create_edge("Student", "Swimmable", Relationship.implement) \
.create_edge("People", "Food", Relationship.depend)
builder.save("graphy", False, OutputFormat.png)