文档章节

PlantUML

双截龙
 双截龙
发布于 2017/04/11 17:04
字数 2240
阅读 29
收藏 0

类之间的关系

PlantUML用下面的符号来表示类之间的关系:

  • 泛化,Generalization<|--
  • 关联,Association<--
  • 组合,Composition*--
  • 聚合,Aggregationo--
  • 实现,Realization<|..
  • 依赖,Dependency<..

以上是常见的六种关系,--可以替换成..就可以得到虚线。另外,其中的符号是可以改变方向的,例如:<|--表示右边的类泛化左边的类;--|>表示左边的类泛化右边的类。

例如,下面的是--

@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

生成的类图如下:

定义可见性

以下符号定义字段或者方法的可见性:

  • -private
  • #protected
  • ~package private
  • +public

例如:

@startuml

class Dummy {
 -field1
 #field2
 ~method1()
 +method2()
}

@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 ofnote right ofnote top ofnote bottom of关键字进行定义。

你也可以在最后一个定义的类上使用note leftnote rightnote topnote 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标签进行修饰:

  • <b>
  • <u>
  • <i>
  • <s><del><strike>
  • <font color="#AAAAAA"> 或者 <font color="colorName">
  • <color:#AAAAAA> 或者 <color:colorName>
  • <size:nn> 该表font大小
  • <img src="file"> 或者 <img:file>,文件必须是可以访问的。
@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

连接上的注释

可以在连接上定义注释,只需要使用note on link,你可以使用note left on linknote right on linknote top on linknote 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来定义抽象类或者接口,也可以使用annotationenum关键字来定义注解或者枚举。

@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

设置Legend

@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

Repository接口

@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

Java异常层次

@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

设置Legend

@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

Repository接口

@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

Java异常层次

@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

本文转载自:https://yq.aliyun.com/articles/25405

双截龙
粉丝 0
博文 2
码字总数 1015
作品 0
广州
程序员
私信 提问
自定义PlantUML和C4Model的样式

什么是PlantUml PlantUml是一个支持快速绘制的开源项目.其定义了一套完整的语言用于实现UML关系图的描述.并基于强大的graphviz图形渲染库进行UML图的生成.绘制的UML图还可以导出为图片,以及通...

假正经哥哥
03/18
0
0
ubuntu安装PlantUML

安装graphviz 这是PlantUML依赖的图形库,支持所有OS, 可以在此下载 http://graphviz.org/Download..php ubuntu平台可以直接到这里:https://launchpad.net/~gviz-adm/+archive/ubuntu/gra...

cyper
2015/07/07
0
0
使用Roslyn的C#语言服务实现UML类图的自动生成

最近在项目中实现了一套基于Windows Forms的开发框架,个人对于本身的设计还是比较满意的,因此,打算将这部分设计整理成文档,通过一些UML图形比如类图(Class Diagram)来描述整个框架的设...

dotNET跨平台
2018/09/12
0
0
VNote 1.15,更好的图表,更好的预览

VNote 1.15 发布啦!作为一个更懂程序员的 Markdown 笔记,这次 VNote 终于支持 PlantUML 和 Graphviz 了。 支持 PlantUML, Graphviz ; 支持 PlantUML, Graphviz, MathJax 以及 Flowchart....

tamlok
2018/04/30
1K
8
Codeuml —— 设计 UML 图表跟你编码一样快

简介 Codeuml是一个基于Web的UML设计工具,你可以用一种特别的语言编写图例,并快速输出图形。它比任何图形化设计工具(拖拽元素和点击鼠标连接元素)都来得更有效率。Codeuml使用开源引擎p...

oschina
2014/03/06
909
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部