UML作业第二次:类图中类的表示
第一部分:PlantUML类图 语法总结
类之间的关系通过下面的符号定义:
使用
..
来代替 --
可以得到点 线
例:
@startuml Class01 <|-- Class02 Class03 *-- Class04 Class05 o-- Class06 Class07 .. Class08 Class09 -- Class10 @enduml
@startuml Class11 <|.. Class12 Class13 --> Class14 Class15 ..> Class16 Class17 ..|> Class18 Class19 <--* Class20 @enduml
@startuml Class21 #-- Class22 Class23 x-- Class24 Class25 }-- Class26 Class27 +-- Class28 Class29 ^-- Class30 @enduml
关系上的标识:
在关系之间使用标签来说明时, 使用 :
后接 标签文字
对元素的说明,你可以在每一边使用 ""
来说明
@startuml Class01 "1" *-- "many" Class02 : contains Class03 o-- Class04 : aggregation Class05 --> "1" Class06 @enduml
在标签的开始或结束位置添加<
或 >
以表明是哪个对象作用到哪个对象上
@startuml class Car Driver - Car : drives > Car *- Wheel : have 4 > Car -- Person : < owns @enduml
添加方法:
为了声明域或者方法,你可以使用 后接域名或方法名
系统检查是否有括号来判断是方法还是域
@startuml Object <|-- ArrayList Object : equals() ArrayList : Object[] elementData ArrayList : size() @enduml
也可以使用{}
把域或者方法括起来
注意,这种语法对于类型/名字的顺序是非常灵活的
@startuml class Dummy { String data void methods() } class Flight { flightNumber : Integer departureTime : Date } @enduml
@startuml class Dummy { {field} A field (despite parentheses) {method} Some method } @enduml
定义可访问性:一旦你定义了域或者方法,你可以定义 相应条目的可访问性质
抽象与静态:
通过修饰符{static}
或者{abstract}
,可以定义静态或者抽象的方法或者属性
这些修饰符可以写在行的开始或者结束。也可以使用{classifier}
这个修饰符来代替{static}
高级类体:
PlantUML默认自动将方法和属性重新分组,你可以自己定义分隔符来重排方法和属性,下面的分隔符都是可用的:--
..
==
__
.
备注和模板:
模板通过类关键字("<<"和">>")来定义
可以使用note left of
, note right of
, note top of
, note bottom of
这些关键字来添加备注。
还可以在类的声明末尾使用note left
, note right
,note top
, note bottom
来添加备注
@startuml class Object << general >> Object <|--- ArrayList note top of Object : In java, every class\nextends this one. note "This is a floating note" as N1 note "This note is connected\nto several objects." as N2 Object .. N2 N2 .. ArrayList class Foo note left: On last defined class @enduml
链接的注释:
在定义链接之后,你可以用 note on link
给链接添加注释
如果想要改变注释相对于标签的位置,你也可以用 note left on link
, note right on link
, note bottom on link
。(对应位置分别在label的左边,右边,下边)
抽象类和接口:
用关键字abstract
或abstract class
来定义抽象类。抽象类用斜体显示。 也可以使用interface
, annotation
和 enum
关键字
@startuml abstract class AbstractList abstract AbstractCollection interface List interface Collection List <|-- AbstractList Collection <|-- AbstractCollection Collection <|- List AbstractCollection <|- AbstractList AbstractList <|-- ArrayList class ArrayList { Object[] elementData size() } enum TimeUnit { DAYS HOURS MINUTES } annotation SuppressWarnings @enduml
使用非字母字符:
如果你想在类(或者枚举)的显示中使用非字母符号,你可以:
- 在类的定义中使用
as
关键字 - 在类名旁边加上
""
隐藏类:
你也可以使用 show/hide
命令来隐藏类
如果你定义了一个大的!included 文件,且想在文件包含之后隐藏部分类,该功能会很有帮助
泛型:
可以用 <
和 >
来定义类的泛型
包:
可以通过关键词 package
声明包,同时可选的来声明对应的背景色(通过使用html色彩代码或名称)
注意:包可以被定义为嵌套。
包样式:
包可以定义不同的样式。
你可以通过以下的命令来设置默认样式 : skinparam packageStyle
,或者对包使用对应的模板:
@startuml scale 750 width package foo1 <<Node>> { class Class1 } package foo2 <<Rectangle>> { class Class2 } package foo3 <<Folder>> { class Class3 } package foo4 <<Frame>> { class Class4 } package foo5 <<Cloud>> { class Class5 } package foo6 <<Database>> { class Class6 } @enduml
棒棒糖 接口:
需要定义棒棒糖样式的接口时可以遵循以下语法:
bar ()- foo
bar ()-- foo
foo -() bar
@startuml class foo bar ()- foo @enduml
拆分大文件:
有些情况下,会有一些很大的图片文件。
可以用 page (hpages)x(vpages)
这个命令把生成的图片文件拆分成若干个文件。
hpages
用来表示水平方向页面数, and vpages
用来表示垂直方面页面数。
你也可以使用特定的皮肤设定来给分页添加边框
@startuml ' Split into 4 pages page 2x2 skinparam pageMargin 10 skinparam pageExternalColor gray skinparam pageBorderColor black class BaseClass namespace net.dummy #DDDDDD { .BaseClass <|-- Person Meeting o-- Person .BaseClass <|- Meeting } namespace net.foo { net.dummy.Person <|- Person .BaseClass <|-- Person net.dummy.Meeting o-- Person } BaseClass <|-- net.unused.Person @enduml
第二部分:以班级学生管理系统中的 —— “学生” 类为例
学生是一个类,同时和宿舍,课程,教室有关
学生有对应的一个宿舍,多门课程,每门课程有对应的教室
用PlantUML 编写 “学生” 类 绘图脚本,例图:
@startuml class 课程 { -课程号:int -课程名:string -老师:string __ +选课信息 } class 学生{ -学号:int -姓名:string -班级:string -专业:string __ +登陆 +修改信息 +退出 +已选课程 +课程信息 } class 宿舍 { -楼号:int -宿舍号:int -床位:int __ +登陆 +修改信息 +退出 } class 教室 { -地点:string -每时段对应课程:string -容纳人数:int __ +教室信息 +教职人员 } 课程 -right-> 学生 宿舍 -left-> 学生 学生 -down-> 教室 课程 -->教室 @enduml