PlantUML类图
以上是常见的六种关系,--可以替换成..就可以得到虚线。另外,其中的符号是可以改变方向的,例如: |--表示右边的类泛化左边的类;--| 表示左边的类泛化右边的类。
例如,下面的是--:
@startuml Class01 |-- Class02:泛化 Class03 -- Class04:关联 Class05 *-- Class06:组合 Class07 o-- Class08:聚合 Class09 -- Class10 @enduml
生成的类图如下:
--可以替换成..,对应的虚线:
@startuml Class11 |.. Class12:实现 Class13 .. Class14:依赖 Class15 *.. Class16 Class17 o.. Class18 Class19 .. Class20 @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
生成的类图如下:
上面的类图意思是:
Driver 驾驶 Car Car 有4个 Wheel Person 拥有 Car在类名后面添加冒号可以添加方法和方法的参数,例如:
@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
生成的类图如下:
以下符号定义字段或者方法的可见性:
你可以使用skinparam classAttributeIconSize 0关掉icon的显示:
@startuml skinparam classAttributeIconSize 0 class Dummy { -field1 #field2 ~method1() +method2() @enduml
你可以使用{static}或者{abstract}来修饰字段或者方法,修饰符需要在行的开头或者末尾使用。你也可以使用{classifier}代替{static}。
@startuml class Dummy { {static} String id {classifier} String name {abstract} void methods() @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 classes class User { .. Simple Getter .. + getName() + getAddress() .. Some setter .. + setName() __ private data __ int age -- encrypted -- String password @enduml
原型使用class、 和 进行定义。
注释使用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
注释可以使用一些html标签进行修饰:
s , del , strike连接上的注释
可以在连接上定义注释,只需要使用note on link,你可以使用note left on link、note right on link、note top on link、note bottom on link来改变注释的位置。
@startuml class Dummy Dummy -- Foo : A link note on link #red: note that is red Dummy -- Foo2 : Another link note right on link #blue this is my note on right link and in blue end note @enduml
可以使用abstract或者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
类名可以使用非字母的方式显示:
@startuml class "This is my class" as class1 class class2 as "It works this way too" class2 *-- "foo/dummy" : use @enduml
@startuml class Dummy1 { +myMethods() class Dummy2 { +hiddenMethod() class Dummy3 Serializable { String name hide members hide Serializable circle show Dummy1 methods show Serializable fields @enduml
@startuml class Foo1 class Foo2 Foo2 *-- Foo1 hide Foo2 @enduml
@startuml class Foo ? extends Element { int size() Foo *- Element @enduml
@startuml package "Classic Collections" #yellow{ Object |-- ArrayList package net.sourceforge.plantuml { Object |-- Demo1 Demo1 *- Demo2 @enduml
包可以设置样式,也可以使用skinparam packageStyle设置为默认样式。
@startuml scale 750 width package foo1 Node { class Class1 package foo2 Rect { class Class2 package foo3 Folder { class Class3 package foo4 Frame { class Class4 package foo5 Cloud { class Class5 package foo6 Database { class Class6 @enduml
也可以在包之间设置联系:
@startuml skinparam packageStyle rect package foo1.foo2 { package foo1.foo2.foo3 { class Object foo1.foo2 +-- foo1.foo2.foo3 @enduml
命名空间内使用默认的类,需要在类名前加上点。
@startuml 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
命名空间可以自动设置,通过set namespaceSeparator ???设置命名空间分隔符,使用set namespaceSeparator none可以关闭自动设置命名空间。
@startuml set namespaceSeparator :: class X1::X2::foo { some info @enduml
@startuml Room o- Student Room *-- Chair @enduml
换个方向:
@startuml Student -o Room Chair --* Room @enduml
也可以在箭头上使用left, right, up or down关键字:
@startuml foo -left- dummyLeft foo -right- dummyRight foo -up- dummyUp foo -down- dummyDown @enduml
这些关键字可以使用开头的几个字符简写,例如,使用-d-代替-down-。
使用title或者title end title。
@startuml title Simple b example /b \nof title Object |-- ArrayList @enduml
@startuml Object |- ArrayList legend right b Object /b and b ArrayList /b are simple class endlegend @enduml
一个类和两个类有关联时设置关系:
@startuml class Student { Name Student "0..*" - "1..*" Course (Student, Course) .. Enrollment class Enrollment { drop() cancel() @enduml
换一个方向:
@startuml class Student { Name Student "0..*" -- "1..*" Course (Student, Course) . Enrollment class Enrollment { drop() cancel() @enduml
还有一些特性,如设置皮肤参数、颜色、拆分大文件等等,请参考官方文档。
一个完整的例子:
@startuml title class-diagram.png scale 1.5 /组合关系(composition)/ class Human { - Head mHead; - Heart mHeart; - CreditCard mCard; + void travel(Vehicle vehicle); Human *-up- Head : contains Human *-up- Heart : contains /聚合关系(aggregation)/ Human o-left- CreditCard : owns /依赖关系(dependency)/ Human .down. Vehicle : dependent /关联关系(association/ Human -down- Company : associate /继承关系(extention)/ interface IProgram { + void program(); class Programmer { + void program(); Programmer -left-| Human : extend Programmer .up.| IProgram : implement @enduml
下面例子,参考自Class Diagram。
Java集合类图@startuml abstract class AbstractList abstract AbstractCollection interface List interface Collection List |-- AbstractList Collection |-- AbstractCollection Collection |- List AbstractCollection |- AbstractList AbstractList |-- ArrayList ArrayList : Object[] elementData ArrayList : size() enum TimeUnit TimeUnit : DAYS TimeUnit : HOURS TimeUnit : MINUTES @enduml
@startuml Object -- AbstractList class ArrayList extends Object { int size interface List extends Collection { add() interface Set extends Collection class TreeSet implements SortedSet @enduml
@startuml package framework Folder { interface BasicRepository { E find(Object pk); List E findAll(); void save(E entity); void update(E entity); void remove(E entity); class AbstractHibernateRepository @Repository { -EntityManager entityManager; interface PartnerRepository { List PartnerEntity findByFoo(...); List PartnerEntity search(String pattern, int maxResult); class HibernatePartnerRepository @Repository { class InMemoryPartnerRepository { BasicRepository |.. PartnerRepository BasicRepository |.. AbstractHibernateRepository AbstractHibernateRepository |-- HibernatePartnerRepository PartnerRepository |.. HibernatePartnerRepository PartnerRepository |.. InMemoryPartnerRepository @enduml
@startuml namespace java.lang #DDDDDD { class Error unchecked Throwable |-- Error Throwable |-- Exception Exception |-- CloneNotSupportedException Exception |-- RuntimeException RuntimeException |-- ArithmeticException RuntimeException |-- ClassCastException RuntimeException |-- IllegalArgumentException RuntimeException |-- IllegalStateException Exception |-- ReflectiveOperationException ReflectiveOperationException |-- ClassNotFoundException namespace java.io #DDDDDD { java.lang.Exception |-- IOException IOException |-- EOFException IOException |-- FileNotFoundException namespace java.net #DDDDDD { java.io.IOException |-- MalformedURLException java.io.IOException |-- UnknownHostException @enduml
UML学习(一)----使用plantuml画时序图 之前都是使用processon来画UML图,虽说有很多模板,画图也比较方便。但是,非会员的话最多只能保存14张图,这就很坑了。每次对图的变更也不太方便,所以琢磨了下,发现了一款好用的画UML图的工具plantuml。 PlantUML是一个开源项目,支持采用编码的方式快速绘制图。这对于我们广大程序员而言无疑是很大的福音。PlantUML的官方文档。
使用 PlantUML 画 UML(上)类图 大家平日在写技术文档时,往往都有画 UML 图的需要,PrecessOn 或者 darw.io 等来绘制 UML 勉强可用但是不够专业。这里为大家推荐一个专门画UML的工具: PlantUML
使用PlantUML画UML(下) 时序图 UML 序列图 序列图是仅次于类图的最常用 UML 图。 序列图将交互关系表示为一个二维图,纵向是时间轴,时间沿竖线向下延伸;横向轴代表了在协作中各个角色,一般是一个 Class 的对象,用一条虚线代
雨客 微博@JavaChen,这里的所有博客文章来自http://blog.javachen.com/。