Для отношения можно добавить метку. Делается это с помощью указания символа :, после которого указывается текст метки. Для указания количества элементов на каждой стороне отношения можно использовать двойные кавычки "".
Вы можете добавить дополнительные стрелки < или > в начале или в конце метки, указывающие на использование одного из объектов другим объектом.
@startuml
class Car
Driver - Car : drives >
Car *- Wheel : have 4 >
Car -- Person : < owns
@enduml
Добавление методов
Для объявления полей и методов вы можете использовать символ :, после которого указывается имя поля или метода. Для определения того, что вы указали метод или поле, система ищет скобки.
Вы можете определить статические или абстрактные методы и поля используя модификаторы {static} и {abstract} соответственно. Эти модификаторы могут располагаться как в начале так и в конце строки. Вы так же можете использовать {classifier} как замену для {static}.
@startuml
class Dummy {
{static} String id
{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 class
}
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. Ключевым словом note легко создать заметку без привязи, а после, используя символ .., привязать её к другим объектам.
@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-тегов, таких как:
<b>
<u>
<i>
<s>, <del>, <strike>
<font color="#AAAAAA"> or <font color="colorName">
<color:#AAAAAA> or <color:colorName>
<size:nn> to change font size
<img src="file"> or <img:file>: the file must be accessible by the filesystem
Заметка может быть из нескольких строк. Можно определить заметку для класса, заданного последним, с помощью note left, note right, note top, note bottom.
@startuml
class Foo
note left: On last defined class
note top of Object
In java, <size:18>every</size> <u>class</u>
<b>extends</b>
<i>this</i> one.
end note
note as N1
This note is <u>also</u>
<b><color:royalBlue>on several</color>
<s>words</s> lines
And this is hosted by <img:sourceforge.jpg>
end note
@enduml
WARNING
This translation need to be updated.
WARNING
Note on field (field, attribute, member) or method
It is possible to add a note on field (field, attribut, member) or on method.
Note on field or method
@startuml
class A {
{static} int counter
+void {abstract} start(int timeout)
}
note right of A::counter
This member is annotated
end note
note right of A::start
This method is now explained in a UML note
end note
@enduml
Note on method with the same name
@startuml
class A {
{static} int counter
+void {abstract} start(int timeoutms)
+void {abstract} start(Duration timeout)
}
note left of A::counter
This member is annotated
end note
note right of A::"start(int timeoutms)"
This method with int
end note
note right of A::"start(Duration timeout)"
This method with Duration
end note
@enduml
Возможно добавить заметку на связь, сразу после определения связи, используя 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 или 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
Использование не буквенных символов
Если вы хотите использовать не буквенные символы в названии класса (или другого объекта), вы можете использовать 2 способа :
Использовать ключевое слово as в определении класса
Поставить кавычки "" вокруг имени класса
@startuml
class "This is my class" as class1
class class2 as "It works this way too"
class2 *-- "foo/dummy" : use
@enduml
Скрытие атрибутов, методов...
Вы можете управлять видимостью классов с помощью команды hide/show. Базовая команда это - hide empty members. Команда скроет атрибуты или методы, если они пусты. Вместо empty members, вы можете использовать:
empty fields или empty attributes для пустых полей,
empty methods для пустых методов,
fields или attributes, которые скроют поля, даже если они были описаны,
methods, которые скроют методы, даже если они были описаны,
members, которые скроют поля и методы, даже если они были описаны,
circle для круглых символов перед именем класса,
stereotype для шаблона.
Вы также можете указать ключевое слово, сразу за hide или show:
class для всех классов,
interface для всех интерфейсов,
enum для всех перечислений,
<<foo1>> для классов, к которым применен шаблон с помощью foo1,
имя существующего названия класса.
Для определения большого набора, состоящего из правил и исключений, можно использовать несколько команд show/hide.
@startuml
class Dummy1 {
+myMethods()
}
class Dummy2 {
+hiddenMethod()
}
class Dummy3 <<Serializable>> {
String name
}
hide members
hide <<Serializable>> circle
show Dummy1 methods
show <<Serializable>> fields
@enduml
Скрытие классов
Вы также можете использовать команду show/hide, чтобы скрывать классы. Это может быть полезно, если вы определяете большой !подключенный файл, и если вы хотите скрыть некоторые классы после включения.
@startuml
class Foo1
class Foo2
Foo2 *-- Foo1
hide Foo2
@enduml
WARNING
This translation need to be updated.
WARNING
Remove classes
You can also use the remove commands to remove classes. This may be useful if you define a large !included file, and if you want to remove some classes after file inclusion.
@startuml
class Foo1
class Foo2
Foo2 *-- Foo1
remove Foo2
@enduml
Hide or Remove unlinked class
By default, all classes are displayed:
@startuml
class C1
class C2
class C3
C1 -- C2
@enduml
But you can:
hide @unlinked classes:
@startuml
class C1
class C2
class C3
C1 -- C2
hide @unlinked
@enduml
or remove @unlinked classes:
@startuml
class C1
class C2
class C3
C1 -- C2
remove @unlinked
@enduml
Вы также можете использовать скобки < и > чтобы указать на использование дженериков в классе.
@startuml
class Foo<? extends Element> {
int size()
}
Foo *- Element
@enduml
Вы можете отключить отрисовку этих элементов, используя команду skinparam genericDisplay old.
Определение метки
Обычно, метка с буквой (C, I, E or A) испольуется для классов, интерфейсов, перечисления и абстрактных классов. Но также вы можете использовать свою собственную метку для класса, когда создаёте шаблон, добавляя одну букву и цвет, как в этом примере:
@startuml
class System << (S,#FF7700) Singleton >>
class Date << (D,orchid) >>
@enduml
Пакеты
Вы можете определить пакет, используя ключевое слово package, с возможностью объявить ещё и цвет его фона, (используя html-код цвета или его имя). Обратите внимание, что определения пакета могут быть вложенными.
В пакетах, имя класса является уникальным идентификатором этого класса. Это значит, что у вас не может быть двух одноименных классов в разных блоках. В этом случае, вам следует использовать пространства имен вместо пакетов. Вы можете ссылаться на классы из других пространств имён по их полному определению. Классы из пространства имён по умолчанию определяются ведущей точкой. Обратите внимание, что вы не обязаны явно создавать пространство имен: полностью определенный класс автоматически попадает в правильное пространство имен.
@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 ???.
@startuml
set namespaceSeparator ::
class X1::X2::foo {
some info
}
@enduml
Вы можете отключить автоматическое создание пакетов используя команду set namespaceSeparator none.
@startuml
set namespaceSeparator none
class X1.X2.foo {
some info
}
@enduml
Lollipop интерфейс
Вы также можете задать lollipops интерфейсы на классах, используя следующий синтаксис:
bar ()- foo
bar ()-- foo
foo -() bar
@startuml
class foo
bar ()- foo
@enduml
Изменение направления стрелок
По умолчанию, связи между классами имеют два тире --и вертикально ориентированны. Возможно создать горизонтальную связь, используя одно тире (or dot) вот так:
@startuml
Room o- Student
Room *-- Chair
@enduml
Вы можете изменить направление перевернув связь:
@startuml
Student -o Room
Chair --* Room
@enduml
Также возможно изменять направление стрелок, добавляя ключевые слова left, right, up или down внутри стрелки:
Вы можете укоротить запись, используя только первую букву направления (например, -d- вместо -down-) или две первые буквы (-do-). Заметьте, что вам не стоит пользоваться этой функциональностью без особой надобности: Graphviz обычно предоставляет хорошие результаты без дополнительной настройки.
Ассоциация классов
Вы можете задать ассоциацию класса после того, как была задана связь между двумя классами, как в примере:
@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
Association on same classe
@startuml
class Station {
+name: string
}
class StationCrossing {
+cost: TimeInterval
}
<> diamond
StationCrossing . diamond
diamond - "from 0..*" Station
diamond - "to 0..* " Station
@enduml
Можно объявить индивидуальный цвет для классов или примечаний, используя # обозначения. Можно использовать как стандартные названия цветов, так и RGB-код. Так же возможно использование градиента для фона, используя следующие символы для разделения пары цветов:
|,
/,
\,
or -
в зависимости от направления градиента Например так :
@startuml
skinparam backgroundcolor AntiqueWhite/Gold
skinparam classBackgroundColor Wheat|CornflowerBlue
class Foo #red-green
note left of Foo #blue\9932CC
this is my
note on this class
end note
package example #GreenYellow/LightGoldenRodYellow {
class Dummy
}
@enduml
WARNING
This translation need to be updated.
WARNING
Помощь в расположении классов
Sometimes, the default layout is not perfect... You can use together keyword to group some classes together : the layout engine will try to group them (as if they were in the same package). You can also use hidden links to force the layout.
@startuml
class Bar1
class Bar2
together {
class Together1
class Together2
class Together3
}
Together1 - Together2
Together2 - Together3
Together2 -[hidden]--> Bar1
Bar1 -[hidden]> Bar2
@enduml
Разделение больших файлов
Иногда могут получиться очень большие файлы изображений. Вы можете использовать команду page (hpages)x(vpages) чтобы разделить создаваемое изображение на несколько файлов (страниц) : hpages - это задание числа горизонтальных страниц, и vpages - это задание числа вертикальных страниц.. Здесь также можно использовать специфику skinparam настроек как цвета разделённых страниц, так и их границы (смотри пример).
@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
Extends and implements
It is also possible to use extends and implements keywords.
@startuml
class ArrayList implements List
class ArrayList extends AbstractList
@enduml
Bracketed relations (linking or arrow) style
Line style
It's also possible to have explicitly bold, dashed, dotted, hidden or plain relation, links or arrows:
without label
@startuml
title Bracketed line style without label
class foo
class bar
bar1 : [bold]
bar2 : [dashed]
bar3 : [dotted]
bar4 : [hidden]
bar5 : [plain]
foo --> bar
foo -[bold]-> bar1
foo -[dashed]-> bar2
foo -[dotted]-> bar3
foo -[hidden]-> bar4
foo -[plain]-> bar5
@enduml
with label
@startuml
title Bracketed line style with label
class foo
class bar
bar1 : [bold]
bar2 : [dashed]
bar3 : [dotted]
bar4 : [hidden]
bar5 : [plain]
foo --> bar : ∅
foo -[bold]-> bar1 : [bold]
foo -[dashed]-> bar2 : [dashed]
foo -[dotted]-> bar3 : [dotted]
foo -[hidden]-> bar4 : [hidden]
foo -[plain]-> bar5 : [plain]
@enduml
@startuml
title Bracketed line style mix
class foo
class bar
bar1 : [#red,thickness=1]
bar2 : [#red,dashed,thickness=2]
bar3 : [#green,dashed,thickness=4]
bar4 : [#blue,dotted,thickness=8]
bar5 : [#blue,plain,thickness=16]
foo --> bar : ∅
foo -[#red,thickness=1]-> bar1 : [#red,1]
foo -[#red,dashed,thickness=2]-> bar2 : [#red,dashed,2]
foo -[#green,dashed,thickness=4]-> bar3 : [#green,dashed,4]
foo -[#blue,dotted,thickness=8]-> bar4 : [blue,dotted,8]
foo -[#blue,plain,thickness=16]-> bar5 : [blue,plain,16]
@enduml
Change relation (linking or arrow) color and style (inline style)
You can change the color or style of individual relation or arrows using the inline following notation:
#color;line.[bold|dashed|dotted];text:color
@startuml
class foo
foo --> bar : normal
foo --> bar1 #line:red;line.bold;text:red : red bold
foo --> bar2 #green;line.dashed;text:green : green dashed
foo --> bar3 #blue;line.dotted;text:blue : blue dotted
@enduml
@startuml
abstract abstract
annotation annotation #pink;line:red;line.bold;text:red
class class #palegreen;line:green;line.dashed;text:green
interface interface #aliceblue;line:blue;line.dotted;text:blue
@enduml
First original example:
@startuml
class bar #line:green;back:lightblue
class bar2 #lightblue;line:green
class Foo1 #back:red;line:00FFFF
class FooDashed #line.dashed:blue
class FooDotted #line.dotted:blue
class FooBold #line.bold
class Demo1 #back:lightgreen|yellow;header:blue/red
@enduml
@startuml
left to right direction
class User {
id : INTEGER
..
other_id : INTEGER
}
class Email {
id : INTEGER
..
user_id : INTEGER
address : INTEGER
}
User::id *-- Email::user_id
@enduml