PlantUML类图

 

雨客 2016-04-08 11:38:03 浏览796 评论0

摘要: 类之间的关系 PlantUML用下面的符号来表示类之间的关系: 泛化,Generalization:<|-- 关联,Association:<-- 组合,Composition:*-- 聚合,Aggregation:o-- 实现,Realization:<|.. 依赖,Dependency:<.. 以上是常见的六种关系,--可以替换成..就可以得到虚线。

类之间的关系

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

PlantUML类图的更多相关文章

  1. [emacs] Drawing uml under emacs org-mode using plantUML - 类图

    [emacs] Drawing uml under emacs org-mode using plantUML - 类图 // */ // ]]>   [emacs] Drawing uml u ...

  2. UML作业第三次:分析《书店图书销售管理系统,绘制类图

    plantuml类图绘制方法的学习: 1.关于类图的学习: 类图显示了系统的静态结构. 类:类图中的主要元素,用矩形表示.矩形的上层表示类名.中层表示属性.下层表示方法. 类之间的关系:关联.依赖.聚 ...

  3. mac版本idea使用(二)-如何安装PlantUML画时序图、类图

    在跟踪spring源码的时候,看见网上的博客好多使用了idea自带的展示类继承关系图的功能,这个地方使用了idea的diagrams-show diagram,就可以显示类的继承图,很神奇的样子,记录 ...

  4. UML类图介绍以及PlantUML使用方法

    类的UML表示方法 UML介绍 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是 ...

  5. CentO7-使用plantuml绘制UML类图

    准备工作 到PlantUml官网(http://plantuml.com/download)下载plantuml.jar.官网上还有一个在线的demof服务.plantuml的官网真的很挫! 到官网下 ...

  6. UML作业第二次:类图中类的表示

    1.关于类图的学习: 类图显示了系统的静态结构. 类:类图中的主要元素,用矩形表示.矩形的上层表示类名.中层表示属性.下层表示方法. 类之间的关系:关联.依赖.聚集.泛化和实现五种. 2.五种类间关系 ...

  7. UML与软件建模:第二次作业(类图中类的表示)

    一.类图 (1)类图定义 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是在&q ...

  8. 练习UML类图中的类的表示

    第一部分:UML类图(class diagram) 类图用来展现一组类.类的特性以及其类相互之间的关系,一个类图由一组类以及它们之间的关系构成,类图用来对系统的领域概念以及静态结构进行建模. 在软件模 ...

  9. UML作业第三次:分析《书店图书销售管理系统》,绘制类图

    一. 类图语法学习小结(类间关系的表示方法) 1.抽象类和接口 我们用关键字abstract或abstract class来定义抽象类(抽象类用斜体显示).也可以使用interface,annotat ...

随机推荐

  1. IT视频课程集(包含各类Oracle、DB2、Linux、Mysql、Nosql、Hadoop、BI、云计算、编程开发、网络、大数据、虚拟化

    马哥Linux培训视频课程:http://pan.baidu.com/s/1pJwk7dp Oracle.大数据系列课程:http://pan.baidu.com/s/1bnng3yZ 天善智能BI培 ...

  2. ES6的新特性(14)——Iterator 和 for...of 循环

    Iterator 和 for...of 循环 Iterator(遍历器)的概念 JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Ma ...

  3. 关于requestanimationframe

    首先字面理解,请求动画框架, 用法: var nextFrame = (function() { return window.requestAnimationFrame || window.webki ...

  4. 总结在Visual Studio Code创建Node.js+Express+handlebars项目

    一.安装node.js环境. Node.js安装包及源码下载地址为:https://nodejs.org/en/download/ 32 位安装包下载地址 : https://nodejs.org/d ...

  5. OOP 学习笔记汇总

    1.1 引用 1.2 const关键字 1.3 动态内存分配 1.4 内联函数和重载函数函数参数缺省值 1.5 类和对象的基本概念与用法1 2.1 类和对象的基本概念2

  6. 【状压dp】AC Challenge

    https://nanti.jisuanke.com/t/30994 把每道题的前置条件用二进制压缩,然后dp枚举所有可能状态,再枚举该状态是从哪一个节点转移来的,符合前置条件则更新. 代码: #in ...

  7. FivePlus——成果展示

    思路描述:描述对于自己此次任务是如何思考的 这次作业没能帮上什么忙,刚开始还对这次作业有所期待,然而,第一次听他们讨论的时候就??? 之后又去查了一些诸如贪吃蛇类的小游戏,知道大概可以达成什么效果,但 ...

  8. lintocde-247-线段树的查询 II

    247-线段树的查询 II 对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素) 实现 ...

  9. MDL详解

    以下的虚拟内存可以理解成逻辑内存,因为我觉得只有这样才能讲通下面所有的东西.以下的“未分页”指没有为页进行编码. 以下为MDL结构体(我很郁闷,我在MSDN上没有找到这个结构体) typedef st ...

  10. centos系统下禁用笔记本触控板

    最近把零几年的老爷笔记本拿出来用,使用windows系统实在太卡了,于是折腾安装上Centos系统了,但是在使用的过程中发现鼠标经常失效.使用了多种方法(比如:http://blog.csdn.net ...