Class Diagrams Syntax
"In software engineering, a class diagram in the Unified Modeling Language (UML) is a type of static structure diagram that describes the structure of a system by showing the system's classes, their attributes, operations (or methods), and the relationships among objects."
-Wikipedia
This page is a reference for the Mermaid syntax for Class Diagram. For a more detailed explanation of the syntax, visit the official Mermaid documentation.
The class diagram is the main building block of object-oriented modeling. It is used for general conceptual modeling of the structure of the application, and for detailed modeling to translate the models into programming code. Class diagrams can also be used for data modeling. The classes in a class diagram represent both the main elements, interactions in the application, and the classes to be programmed.
Mermaid can render class diagrams.
--- title: Animal example --- classDiagram note "From Duck till Zebra" Animal <|-- Duck note for Duck "can fly can swim can dive can help in debugging" Animal <|-- Fish Animal <|-- Zebra Animal : +int age Animal : +String gender Animal: +isMammal() Animal: +mate() class Duck{ +String beakColor +swim() +quack() } class Fish{ -int sizeInFeet -canEat() } class Zebra{ +bool is_wild +run() }
Syntax
Class
UML provides mechanisms to represent class members, such as attributes and methods, and additional information about them. A single instance of a class in the diagram contains three compartments:
- The top compartment contains the name of the class. It is printed in bold and centered, and the first letter is capitalized. It may also contain optional annotation text describing the nature of the class.
- The middle compartment contains the attributes of the class. They are left-aligned and the first letter is lowercase.
- The bottom compartment contains the operations the class can execute. They are also left-aligned and the first letter is lowercase.
--- title: Bank example --- classDiagram class BankAccount BankAccount : +String owner BankAccount : +Bigdecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount)
Define a class
There are two ways to define a class:
- Explicitly using keyword class like
class Animal
which would define the Animal class. - Via a relationship which defines two classes at a time along with their relationship. For instance,
Vehicle <|-- Car
.
classDiagram class Animal Vehicle <|-- Car
Naming convention: a class name should be composed only of alphanumeric characters (including unicode), underscores, and dashes (-).
Class labels
In case you need to provide a label for a class, you can use the following syntax:
classDiagram class Animal["Animal with a label"] class Car["Car with *! symbols"] Animal --> Car
Defining Members of a class
UML provides mechanisms to represent class members such as attributes and methods, as well as additional information about them.
Mermaid distinguishes between attributes and functions/methods based on if the parenthesis ()
are present or not. The ones with ()
are treated as functions/methods, and all others as attributes.
There are two ways to define the members of a class, and regardless of whichever syntax is used to define the members, the output will still be same. The two different ways are :
- Associate a member of a class using : (colon) followed by member name, useful to define one member at a time. For example:
classDiagram class BankAccount BankAccount : +String owner BankAccount : +BigDecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount)
- Associate members of a class using brackets, where members are grouped within curly brackets. Suitable for defining multiple members at once. For example:
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) +withdrawal(amount) }
Return Type
Optionally you can end a method/function definition with the data type that will be returned (note: there must be a space between the final )
and the return type). An example:
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) bool +withdrawal(amount) int }
Generic Types
Generics can be represented as part of a class definition, and for class members/return types. In order to denote an item as generic, you enclose that type within ~
(tilde). Nested type declarations such as List<List<int>>
are supported, though generics that include a comma are currently not supported. (such as List<List<K, V>>
)
note when a generic is used within a class definition, the generic type is NOT considered part of the class name. i.e.: for any syntax which required you to reference the class name, you need to drop the type part of the definition. This also means that mermaid does not currently support having two classes with the same name, but different generic types.
classDiagram class Square~Shape~{ int id List~int~ position setPoints(List~int~ points) getPoints() List~int~ } Square : -List~string~ messages Square : +setMessages(List~string~ messages) Square : +getMessages() List~string~ Square : +getDistanceMatrix() List~List~int~~
Visibility
To describe the visibility (or encapsulation) of an attribute or method/function that is a part of a class (i.e. a class member), optional notation may be placed before that members' name:
+
Public-
Private#
Protected~
Package/Internal
note you can also include additional classifiers to a method definition by adding the following notation to the end of the method, i.e.: after the
()
or after the return type:
*
Abstract e.g.:someAbstractMethod()*
orsomeAbstractMethod() int*
$
Static e.g.:someStaticMethod()$
orsomeStaticMethod() String$
note you can also include additional classifiers to a field definition by adding the following notation to the very end:
$
Static e.g.:String someField$
Defining Relationship
A relationship is a general term covering the specific types of logical connections found on class and object diagrams.
[classA][Arrow][ClassB]
There are eight different types of relations defined for classes under UML which are currently supported:
Type | Description |
---|---|
<|-- | Inheritance |
*-- | Composition |
o-- | Aggregation |
--> | Association |
-- | Link (Solid) |
..> | Dependency |
..|> | Realization |
.. | Link (Dashed) |
classDiagram classA <|-- classB classC *-- classD classE o-- classF classG --> classH classI -- classJ classK ..> classL classM ..|> classN classO .. classP
We can use the labels to describe the nature of the relation between two classes. Also, arrowheads can be used in the opposite direction as well:
classDiagram classA --|> classB : Inheritance classC --* classD : Composition classE --o classF : Aggregation classG --> classH : Association classI -- classJ : Link(Solid) classK ..> classL : Dependency classM ..|> classN : Realization classO .. classP : Link(Dashed)
Labels on Relations
It is possible to add label text to a relation:
classDiagram classA <|-- classB : implements classC *-- classD : composition classE o-- classF : aggregation
Two-way relations
Relations can logically represent an N:M association:
classDiagram Animal <|--|> Zebra
Here is the syntax:
Where Relation Type
can be one of:
Type | Description |
---|---|
<| | Inheritance |
\* | Composition |
o | Aggregation |
> | Association |
< | Association |
|> | Realization |
And Link
can be one of:
Type | Description |
---|---|
-- | Solid |
.. | Dashed |
Define Namespace
A namespace groups classes.
classDiagram namespace BaseShapes { class Triangle class Rectangle { double width double height } }
Cardinality / Multiplicity on relations
Multiplicity or cardinality in class diagrams indicates the number of instances of one class that can be linked to an instance of the other class. For example, each company will have one or more employees (not zero), and each employee currently works for zero or one companies.
Multiplicity notations are placed near the end of an association.
The different cardinality options are :
1
Only 10..1
Zero or One1..*
One or more*
Manyn
n (where n>1)0..n
zero to n (where n>1)1..n
one to n (where n>1)
Cardinality can be easily defined by placing the text option within quotes "
before or after a given arrow. For example:
classDiagram Customer "1" --> "*" Ticket Student "1" --> "1..*" Course Galaxy --> "many" Star : Contains
Annotations on classes
It is possible to annotate classes with markers to provide additional metadata about the class. This can give a clearer indication about its nature. Some common annotations include:
<<Interface>>
To represent an Interface class<<Abstract>>
To represent an abstract class<<Service>>
To represent a service class<<Enumeration>>
To represent an enum
Annotations are defined within the opening <<
and closing >>
. There are two ways to add an annotation to a class, and either way the output will be same:
- In a separate line after a class is defined:
classDiagram class Shape <<interface>> Shape Shape : noOfVertices Shape : draw()
- In a nested structure along with the class definition:
classDiagram class Shape{ <<interface>> noOfVertices draw() } class Color{ <<enumeration>> RED BLUE GREEN WHITE BLACK }
Comments
Comments can be entered within a class diagram, which will be ignored by the parser. Comments need to be on their own line, and must be prefaced with %%
(double percent signs). Any text until the next newline will be treated as a comment, including any class diagram syntax.
classDiagram %% This whole line is a comment classDiagram class Shape <<interface>> class Shape{ <<interface>> noOfVertices draw() }
Setting the direction of the diagram
With class diagrams you can use the direction statement to set the direction in which the diagram will render:
classDiagram direction RL class Student { -idCard : IdCard } class IdCard{ -id : int -name : string } class Bike{ -id : int -name : string } Student "1" --o "1" IdCard : carries Student "1" --o "1" Bike : rides
Notes
It is possible to add notes on the diagram using note "line1\nline2"
. A note can be added for a specific class using note for <CLASS NAME> "line1\nline2"
.
Styling
Styling a node
It is possible to apply specific styles such as a thicker border or a different background color to an individual node using the style
keyword.
classDiagram class Animal class Mineral style Animal fill:#f9f,stroke:#333,stroke-width:4px style Mineral fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5