【UML】- 类图

写在前面

  UML,大家都听过,可是说清楚,能通过UML沟通的人倒不是很多。画图能帮助我们快速回忆一些信息,也方便做大型方案设计。本文将基于IDEA的插件——PlantUML(关于如何安装,请看文档底部的系列文章),并结合plantuml官网,整理出基本的最常用的元素来说明如何绘制类图。如果遇到文章中未整理的其他元素,可自行再去查看官方文档。


目录

  • 写在前面
  • 一、基本概念
  • 二、具体步骤
    • 1.环境说明
    • 2.元素
      • 2.1 具体类
      • 2.2 抽象类、接口、注解、枚举
      • 2.3 包(命名空间)
    • 3.访问权限
    • 4.关系
    • 5.布局
  • 三、参考资料
  • 写在后面
  • 系列文章


一、基本概念

类图,无非就是用图形来快速表示我们平常所写的代码。这里我将代码归纳为以下3类:

1、元素
代码中我们经常用到的元素有:
包、类、抽象类、接口、注解、枚举
属性(成员变量)、方法(构造方法、普通)、性质(get、set)

2、访问权限
私有、默认、保护、公开
静态、抽象

3、关系
继承、实现、依赖、关联(聚合和组合)

好了,接下来我们一一用PlantUML来表示说明。


二、具体步骤

1.环境说明

名称 说明
Mac版本/操作系统/芯片 MacBook Pro/macOS Monterey/Apple M1 Pro
Intellij IDEA版本 Intellij IDEA 2019.2.3(Ultimate Edition)
PlantUML Integration 2.23.0

2.元素

2.1 具体类

先说具体类,其他的大同小异。

具体类:用矩形框表示,
矩形框由上到下分为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::field2部分:属性,声明一个String类型的变量field
end note
note left of Clazz::Clazz3部分:方法,2个构造,1个普通
end note
note left of Clazz::getField4部分:性质,get/set方法
end note

@enduml

对应的uml类图:
【UML】- 类图_第1张图片
对应的java Clazz类:

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;
    }
}

2.2 抽象类、接口、注解、枚举

@startuml

abstract class AbstractQueuedSynchronizer
interface Iterable<T>
annotation FunctionalInterface
enum TimeUnit {
DAYS
HOURS
MINUTES
}

@enduml

对应的uml类图:
【UML】- 类图_第2张图片

2.3 包(命名空间)

@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类图:
【UML】- 类图_第3张图片
!提示:命名空间引用没有命名空间中的类,前面要加上一个英文的点(.);使用命名空间中的类时,要加命名空间。

@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类图:
【UML】- 类图_第4张图片
关于类与类之间的连线,我们会在接下来进行讲解。

3.访问权限

符号表示:

-: 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

对应的uml类图:
【UML】- 类图_第5张图片

4.关系

符号表示:

继承:
空心箭头 + 实线
由子指向父

实现:
空心箭头 + 虚线
由实现类指向接口

依赖:
箭头 + 虚线
由使用方指向被使用方,表示使用方对象持有被使用方对象的引用
方法入参(构造方法、静态方法、普通方法)、返回值、局部变量

关联(聚合、组合):
箭头 + 实线
聚合(空心棱形)
组合(实心棱形)

表达式:
数字:精确的数量
*或者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

对应的uml类图:
【UML】- 类图_第6张图片

5.布局

@startuml

class A
class B
A -- B: '-'可以替换成'*',同理
note right: 2-代表垂直布局

class A1
class B1
A1 - B1
note right: 1-代表水平布局

@enduml

【UML】- 类图_第7张图片


三、参考资料

plantuml官网


写在后面

  如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。


系列文章

【IDEA插件】- PlantUML integration-Can‘t find Graphviz

你可能感兴趣的:(看图说话,uml,java,intellij-idea)