第一部分:UML类图(class diagram)
类图用来展现一组类、类的特性以及其类相互之间的关系,一个类图由一组类以及它们之间的关系构成,类图用来对系统的领域概念以及静态结构进行建模。
在软件模型中,类图是最基本、也最重要的一种图。
类图中的元素有类、接口、协作、关系、注释、约束和包。
类的关系主要有关联、组成、泛化、依赖和接口的实现。
类图的作用主要有以下三点:
- 在软件空间中建立对问题空间抽象的结构映像。
- 用例分析和设计的逻辑结构建模。
- 数据库结构建模。
第二部分:PlantUML类图语法
基本语法:
类之间的关系通过下面的符号定义 :
Type | Symbol | Drawing |
Extension(扩展) | <|-- |
|
Composition(组合) | *-- | ![]()
|
Aggregation(聚合) | o-- | ![]()
|
使用..
来代替 --
可以得到点 线.
例如:
1 @startuml 2 Class01 <|-- Class02 3 Class03 *-- Class04 4 Class05 o-- Class06 5 Class07 .. Class08 6 Class09 -- Class10 7 @enduml
1 @startuml 2 Class11 <|.. Class12 3 Class13 --> Class14 4 Class15 ..> Class16 5 Class17 ..|> Class18 6 Class19 <--* Class20 7 @enduml
1 @startuml 2 Class21 #-- Class22 3 Class23 x-- Class24 4 Class25 }-- Class26 5 Class27 +-- Class28 6 Class29 ^-- Class30 7 @enduml
在关系之间使用标签来说明时, 使用 :
后接 标签文字。
对元素的说明,你可以在每一边使用 ""
来说明.例如:
1 @startuml 2 3 Class01 "1" *-- "many" Class02 : contains 4 5 Class03 o-- Class04 : aggregation 6 7 Class05 --> "1" Class06 8 9 @enduml
在标签的开始或结束位置添加<
或 >
以表明是哪个对象作用到哪个对象上。
1 @startuml 2 class Car 3 4 Driver - Car : drives > 5 Car *- Wheel : have 4 > 6 Car -- Person : < owns 7 8 @enduml
添加方法:
为了声明域或者方法,你可以使用 后接域名或方法名。
系统检查是否有括号来判断是方法还是域。例如:
1 @startuml 2 Object <|-- ArrayList 3 4 Object : equals() 5 ArrayList : Object[] elementData 6 ArrayList : size() 7 8 @enduml
也可以使用{}
把域或者方法括起来。注意,这种语法对于类型/名字的顺序是非常灵活的。
@startuml class Dummy { String data void methods() } class Flight { flightNumber : Integer departureTime : Date } @enduml
1 @startuml 2 class Dummy { 3 {field} A field (despite parentheses) 4 {method} Some method 5 } 6 7 @enduml
定义可访问性:
一旦你定义了域或者方法,你可以定义 相应条目的可访问性质。
Character | Icon for field | Icon for method | Visibility |
- |
![]() |
![]() |
private |
# |
![]() |
![]() |
protected |
~ |
![]() |
![]() |
package private |
+ |
![]() |
![]() |
public |
1 @startuml 2 3 class Dummy { 4 -field1 5 #field2 6 ~method1() 7 +method2() 8 } 9 10 @enduml
你可以采用以下命令停用这些特性 skinparam classAttributeIconSize 0
:
1 @startuml 2 skinparam classAttributeIconSize 0 3 class Dummy { 4 -field1 5 #field2 6 ~method1() 7 +method2() 8 } 9 10 @enduml
抽象与静态:
通过修饰符{static}
或者{abstract}
,可以定义静态或者抽象的方法或者属性。这些修饰符可以写在行的开始或者结束。也可以使用{classifier}
这个修饰符来代替{static}
.
1 @startuml 2 class Dummy { 3 {static} String id 4 {abstract} void methods() 5 } 6 @enduml
高级类体:
PlantUML默认自动将方法和属性重新分组,你可以自己定义分隔符来重排方法和属性,下面的分隔符都是可用的:--
..
==
__
.
还可以在分隔符中添加标题:
@startuml class Foo1 { You can use several lines .. as you want and group == things together. __ You can have as many groups as you want -- End of class } class User { .. Simple Getter .. + getName() + getAddress() .. Some setter .. + setName() __ private data __ int age -- encrypted -- String password } @enduml
备注和模板:
模板通过类关键字("<<"和">>")来定义
你可以使用note left of
, note right of
, note top of
, note bottom of
这些关键字来添加备注。
你还可以在类的声明末尾使用note left
, note right
,note top
, note bottom
来添加备注。
此外,单独用note
这个关键字也是可以的,使用 ..
符号可以作出一条连接它与其它对象的虚线。
链接的注释:
在定义链接之后,你可以用 note on link
给链接添加注释
如果想要改变注释相对于标签的位置,你也可以用 note left on link
, note right on link
, note bottom on link
。(对应位置分别在label的左边,右边,下边)
抽象类和接口:
用关键字abstract
或abstract class
来定义抽象类。抽象类用斜体显示。 也可以使用interface
, annotation
和 enum
关键字。
使用非字母字符:
如果你想在类(或者枚举)的显示中使用非字母字符,你可以:
- 在类的定义中使用
as
关键字 - 在类名旁边加上
""
1 @startuml 2 class "This is my class" as class1 3 class class2 as "It works this way too" 4 5 class2 *-- "foo/dummy" : use 6 @enduml
隐藏类:
你也可以使用 show/hide
命令来隐藏类
如果你定义了一个大的!included文件,且想在文件包含之后隐藏部分类,该功能会很有帮助。
泛型(generics):
你可以用 <
和 >
来定义类的泛型。
1 @startuml 2 3 class Foo<? extends Element> { 4 int size() 5 } 6 Foo *- Element 7 8 @enduml
指定标记(Spot):
通常标记字符 (C, I, E or A) 用于标记 类(classes), 接口(interface), 枚举(enum)和 抽象类(abstract classes).
但是当你想定义原型时,可以增加对应的单个字符及颜色,来定义自己的标记(spot),就像下面一样:
1 @startuml 2 3 class System << (S,#FF7700) Singleton >> 4 class Date << (D,orchid) >> 5 @enduml
包
你可以通过关键词 package
声明包,同时可选的来声明对应的背景色(通过使用html色彩代码或名称)。
注意:包可以被定义为嵌套。
1 @startuml 2 3 package "Classic Collections" #DDDDDD { 4 Object <|-- ArrayList 5 } 6 7 package net.sourceforge.plantuml { 8 Object <|-- Demo1 9 Demo1 *- Demo2 10 } 11 12 @enduml
包样式:
包可以定义不同的样式。
你可以通过以下的命令来设置默认样式 : skinparam packageStyle
,或者对包使用对应的模板:
1 @startuml 2 scale 750 width 3 package foo1 <<Node>> { 4 class Class1 5 } 6 7 package foo2 <<Rectangle>> { 8 class Class2 9 } 10 11 package foo3 <<Folder>> { 12 class Class3 13 } 14 15 package foo4 <<Frame>> { 16 class Class4 17 } 18 19 package foo5 <<Cloud>> { 20 class Class5 21 } 22 23 package foo6 <<Database>> { 24 class Class6 25 } 26 27 @enduml
你也可以参考下面的示例来定义包之间的连线:
1 @startuml 2 3 skinparam packageStyle rectangle 4 5 package foo1.foo2 { 6 } 7 8 package foo1.foo2.foo3 { 9 class Object 10 } 11 12 foo1.foo2 +-- foo1.foo2.foo3 13 14 @enduml
第三部分:以班级学生管理系统中的 —— “学生” 类为例
在班级管理系统中,学生是一个类,与此同时,课程、宿舍、成绩与学生这个类也有着很大的关系。
class 课程 {
-课程号:int
-课程名:string
-主课教师:string
__
+课程信息
+选择课程
}
class 学生{
-学号:int
-姓名:string
-班级:string
-专业:string
__
+登陆
+修改信息
+退出
+已选课程
+课程信息
}
class 宿舍 {
-宿舍号:int
-楼号:int
-所住人员:string
__
+登陆
+修改信息
+退出
}
class 成绩 {
-课程号:int
-课程名:string
-考试成绩:int
__
+课程信息
+查看成绩
}
宿舍 -left-> 学生
学生 -down-> 成绩
@enduml
第四部分:总结
类通常都是用一个矩形来表示,这个矩形分为三部分,最上面是类名,中间是类的属性,最下面是类的操作。
通过类图,能很清晰的就将系统中的各个类对象都描述清楚,然后再根据这些类图来进行设计就非常的方便。
同时,也可以通过类图来对与客户的要求进行完善,以免出现软件设计后却不符合客户要求的情况。