UML,大家都听过,可是说清楚,能通过UML沟通的人倒不是很多。画图能帮助我们快速回忆一些信息,也方便做大型方案设计。本文将基于IDEA的插件——PlantUML(关于如何安装,请看文档底部的系列文章)
,并结合plantuml官网,整理出基本的最常用的元素来说明如何绘制类图。如果遇到文章中未整理的其他元素,可自行再去查看官方文档。
类图,无非就是用图形来快速表示我们平常所写的代码。这里我将代码归纳为以下3类:
1、元素
代码中我们经常用到的元素有:
包、类、抽象类、接口、注解、枚举
属性(成员变量)、方法(构造方法、普通)、性质(get、set)
2、访问权限
私有、默认、保护、公开
静态、抽象
3、关系
继承、实现、依赖、关联(聚合和组合)
好了,接下来我们一一用PlantUML来表示说明。
名称 | 说明 |
---|---|
Mac版本/操作系统/芯片 | MacBook Pro/macOS Monterey/Apple M1 Pro |
Intellij IDEA版本 | Intellij IDEA 2019.2.3(Ultimate Edition) |
PlantUML Integration | 2.23.0 |
先说具体类,其他的大同小异。
具体类:用矩形框表示,
矩形框由上到下分为4个部分:
第1部分:类名称
第2部分:属性(成员变量)
第3部分:方法
第4部分:性质(get/set)
PlantUML文件后缀名为.puml
,文件以@startuml
开始,以@enduml
结束。
以下简单定义一个类,uml语法如下:
@startuml
class Clazz {
field: String
--
Clazz()
Clazz(String field)
method(): String
--
getField(): String
setField(String field): void
}
note top: 第1部分:类名, class用于声明一个类
note left of Clazz::field
第2部分:属性,声明一个String类型的变量field
end note
note left of Clazz::Clazz
第3部分:方法,2个构造,1个普通
end note
note left of Clazz::getField
第4部分:性质,get/set方法
end note
@enduml
public class Clazz {
String field;
public Clazz() {
}
public Clazz(String field) {
this.field = field;
}
String method() {
// return something
return null;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
@startuml
abstract class AbstractQueuedSynchronizer
interface Iterable<T>
annotation FunctionalInterface
enum TimeUnit {
DAYS
HOURS
MINUTES
}
@enduml
@startuml
package java.utils #EEE {
class A{}
class B{}
}
note top: 用package关键字声明一个包
package java.util1 #EEE {
class A{}
class C{}
}
note top: 不同的包中不能使用相同的类名(classA在util包中已经声明,所以在utils1包中没生效)
namespace java.util2 #EEE {
class A{}
class C{}
}
note top: 用namespace关键字声明一个工作空间,可以解决不同包同类名的问题
@enduml
对应的uml类图:
!提示:命名空间引用没有命名空间中的类,前面要加上一个英文的点(.);使用命名空间中的类时,要加命名空间。
@startuml
class BaseClass
namespace net.dummy #EEE {
.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
UML类图:
关于类与类之间的连线,我们会在接下来进行讲解。
符号表示:
-: private(当前类)
#: protected(当前类、同包、子类)
+: public(当前类、同包、子类、其他包)
不带符号表示default(当前类,同包),plantUML中用~表示
_: static(静态方法)
@startuml
class Clazz {
- privateField: String
~ defaultField: String
# protectedField: String
+ publicField: String
{static} staticField: String
--
- privateMethod(): String
~ defaultMethod(): String
# protectedMethod(): String
+ publicMethod(): String
{static} staticMethod(): String
{abstract} abstractMethod(): String
--
+ getPrivateField(): String
+ setPrivateField(): String
}
note left of Clazz::privateField
用-表示私有
end note
note left of Clazz::defaultField
用~表示默认
end note
note left of Clazz::protectedField
用#表示保护
end note
note left of Clazz::publicField
用+表示公开
end note
note left of Clazz::staticField
用{static}表示静态
end note
note right of Clazz::privateMethod
说明:方法与属性在图形上的区别是前者是空心,后者是实心
end note
note right of Clazz::abstractMethod
用{abstract}表示抽象
end note
@enduml
符号表示:
继承:
空心箭头 + 实线
由子指向父
实现:
空心箭头 + 虚线
由实现类指向接口
依赖:
箭头 + 虚线
由使用方指向被使用方,表示使用方对象持有被使用方对象的引用
方法入参(构造方法、静态方法、普通方法)、返回值、局部变量
关联(聚合、组合):
箭头 + 实线
聚合(空心棱形)
组合(实心棱形)
表达式:
数字:精确的数量
*或者0..*:表示0到多个
0..1:表示0或者1个
1..*:表示1个到多个
@startuml
class A1
class B1
A1 <|-- B1
note bottom: 用<|--表示继承
class A2
class B2
A2 <|.. B2
note bottom: 用<|..表示实现
class A3
class B3
A3 <.. B3
note bottom: 用<..表示依赖
class A4
class B4
A4 <-- B4
note bottom: 用<--表示关联
class A5
class B5
A5 "*" --o "1" B5
note bottom: 用--o表示聚合,两边表示数量
class A6
class B6
A6 --* B6
note bottom: 用--*表示组合
@enduml
@startuml
class A
class B
A -- B: '-'可以替换成'*',同理
note right: 2个-代表垂直布局
class A1
class B1
A1 - B1
note right: 1个-代表水平布局
@enduml
plantuml官网
如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。
【IDEA插件】- PlantUML integration-Can‘t find Graphviz