一、 UML基本使用

mermaid官方网址:Class Diagram (mermaid-js.github.io)

官网学习指南:类图的语法和功能

使用classDiagram开启类图编辑

1. 定义一个类

① 使用class关键字

语法:class 类名

如:class Employee

2. 定义类的方法与属性

  • ① 方式一

语法:

类名 : 修饰符 属性
注意:修饰符与属性或者方法间不能有space空格

类名 : 修饰符 方法(参数) 返回值

注意:方法的)与返回值之间必须有space空格

classDiagram    
    class Employee
    Employee : +String name
    Employee : +String password
    Employee : +setLeader(Employee leader) Employee

类图怎么springboot 类图怎么画uml_修饰符

 

 

  • ② 方式二

语法:

class 类名{
修饰符 属性
修饰符 方法 返回值
}

classDiagram
class Employee{
	+String name
	-Integer age
	#String password
	
	+setLeader(Employee leader) Employee
}

类图怎么springboot 类图怎么画uml_List_02

 

3. 返回类型

语法:

修饰符 方法(参数) 返回值

4. 泛型(使用~~包裹)

语法:

修饰符 方法(参数类型泛型 参数名) 返回值

如:+setLeaders(List~Employee~ leaders) List~Employee~

表示 public List<Employee> setLeaders(List<Employee> leaders){...}方法

5. 可见性(访问修饰符)

访问修饰符需要与被修饰的方法或者属性一起使用,中间不能有space空格

符号

含义

+

Public

-

Private

#

Protected

~

Package/Internal

抽象、静态的表示会有不同,这两个符号需要在方法的)后面紧跟,不能有space空格。不能修饰属性

符号

含义

*

abstract

$

static

显示上,<u>抽象方法会有下划线</u>,静态方法则表现为斜体

6. 关系描述

Type

Description

<|--

Inheritance 继承

*--

Composition 组合

o--

Aggregation 聚合

-->

Association 关联

--

Link (Solid) 连接实线

..>

Dependency 依赖

..|>

Realization 实现

..

Link (Dashed) 连接虚线

 

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)

 

类图怎么springboot 类图怎么画uml_uml_03

 

类图怎么springboot 类图怎么画uml_uml_04

 

7. 关系标签

语法:[类A][关系描述][类B] : 标签描述

如:classA --|> classB : Inheritance

8. 类修饰

Type

Description

<<Interface>>

接口

<<abstract>>

抽象类

<<enumeration>>

枚举类

classDiagram
class Shape<<interface>>{
    noOfVertices
    draw()
}

 

类图怎么springboot 类图怎么画uml_uml_05

 

枚举类会稍微特殊一些,如下:

@startuml
class Color  <<enumeration>>{
    RED
    BLUE
    GREEN
    WHITE
    BLACK
}
@enduml

 

类图怎么springboot 类图怎么画uml_List_06

 

9. 注释

语法:%% 注释内容

classDiagram
    %% This whole line is a comment classDiagram class Shape <<interface>>
    class Shape{
        <<interface>>
        noOfVertices
        draw()
    }

注意:由于版本问题,目前主流支持UML的工具暂不支持该语法。
比如,plantuml工具则是使用note来添加备注。

@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

类图怎么springboot 类图怎么画uml_User_07

 

 

二、 类与类之间的关系

1. 关联关系

简言之:一个类中存在一个属性是另一个类。

  • ① 单向关联

表示一个User用户类,包含一个属性是Address地址类,如下:

classDiagram
    class User{
        -Address address
    }
    class Address
    User --> Address

 

类图怎么springboot 类图怎么画uml_uml_08

  • ② 双向关联

表示User用户类内部包含Order属性,Order订单类内部包含User属性,如下:

classDiagram
    class User{
        -List~Order~ orders
    }
    class Order{
        -User user
    }
    User <--> Order

类图怎么springboot 类图怎么画uml_修饰符_09

 

  • ③ 自关联

表示TreeNode二叉树类包含TreeNode属性,如下:

classDiagram
    class TreeNode{
        -int val
        -TreeNode left
        -TreeNode right
    }
    TreeNode --> TreeNode

类图怎么springboot 类图怎么画uml_User_10

 

2. 聚合关系(强关联关系)

简言之:整体与部分之间的关系,部分可以单独存在。

表示SetMeal套餐类聚合了Dish菜品类,如下:

 

classDiagram
    class Dish
    class SetMeal{
        -List~Dish~ dishes
    }
    SetMeal o-- Dish

 

类图怎么springboot 类图怎么画uml_修饰符_11

3. 组合关系(强聚合关系)

简言之:整体与部分之间的关系,部分不能单独存在。

表示LinkedList类组合了Node类,Node类不能单独存在,如下:

classDiagram
    class Node
    class LinkedList{
        -List~Node~ nodes
    }
    LinkedList *-- Node

类图怎么springboot 类图怎么画uml_User_12

注意:此处这个例子不是非常恰当,暂时没有找到合适的例子。

4. 依赖关系

简言之:某个类与另一个类之间存在使用关系。

某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法。

Collection内部使用Iterator的方法(具体可见Collection接口的实现类),如下:

classDiagram
    class Collection{
        <<Interface>>
        +iterator() Iterator~E~
    }
    class Iterator~E~{
        <<Interface>>
        +hasNext() boolean
        +next() E
    }
    Collection ..> Iterator

 

类图怎么springboot 类图怎么画uml_List_13

注意:此处可以看ArrayList类,以及其内部Itr类。

5. 继承关系

简言之:父类与子类的关系。

LinkedHashSet类继承HashSet类,如下:

classDiagram
    class HashSet
    class LinkedHashSet
    HashSet <|-- LinkedHashSet

 

类图怎么springboot 类图怎么画uml_修饰符_14

6. 实现关系

简言之:接口与实现类的关系。

ArrayList类实现List接口,如下:

classDiagram
    class List~E~{
        <<Interface>>
    }
    class ArrayList~E~
    List <|.. ArrayList

 

类图怎么springboot 类图怎么画uml_List_15

三、综合案例

 

@startuml


class UserDTO{
	- userAccount: String
	- userPassword: String
	
	+ getUserAccount(): String
	+ setUserAccount(String userAccount): void
	+ getUserPassword(): String
	+ setUserPassword(String userPassword): void
	# getUser(): UserDTO
}

class RegisterForm{
	- user: UserDTO
	- userDao: IUserDAO
}

class IUserDAO<<interface>>{
	+addUser(UserDTO user): Boolean 
}

class OracleUserDAO{
	+addUser(UserDTO user): Boolean 
}


IUserDAO <|.. OracleUserDAO: 实现Realization
RegisterForm o--> IUserDAO: 聚合Aggregation
RegisterForm *--> UserDTO: 组成Composition
IUserDAO --> UserDTO: 关联Link(Solid)

@enduml

语雀 文本绘图 PlantUML绘图效果

类图怎么springboot 类图怎么画uml_List_16

 

Inteilj IDEA PlantUML 插件绘图效果

类图怎么springboot 类图怎么画uml_修饰符_17

 

classDiagram
class UserDTO{
	- userAccount: String
	- userPassword: String
	
	+ getUserAccount(): String
	+ setUserAccount(String userAccount): void
	+ getUserPassword(): String
	+ setUserPassword(String userPassword): void
	# getUser(): UserDTO
}

class RegisterForm{
	- user: UserDTO
	- userDao: IUserDAO
}

class IUserDAO{
  <<interface>>
	+addUser(UserDTO user): Boolean 
}

class OracleUserDAO{
	+addUser(UserDTO user): Boolean 
}


IUserDAO <|.. OracleUserDAO: 实现Realization
RegisterForm o--> IUserDAO: 聚合Aggregation
RegisterForm *--> UserDTO: 组成Composition
IUserDAO --> UserDTO: 关联Link(Solid)

Typro 纯文本绘图效果

类图怎么springboot 类图怎么画uml_uml_18

 

用户通过注册界面(RegisterForm)输入个人信息, 用户点击“注册”按钮后将输入的信息通过一个封装用户输入数据的对象(UserDTO)传递给操作数据库的数据访问类(DAO), 为了提高系统的扩展性,针对不同的数据库可能需要提供不同的数据访问类,因此提供了数据访问类接口, 如IUserDAO,每一个具体数据访问类都是某一个数据访问类接口的实现类, 如OracleUserDAO就是一个专门用于访问Oracle数据库的数据访问类。

 

UserDTO只是把userAcount,userPassword封装了一下使用了Getter,Setter。

那么肯定是RegisterForm的成员,注册窗体不能没有用户名与密码信息所以是组合关系。RegisterForm没有了用户信息(UserDTO)那么就没有意义了。

然后IUserDAO与RegisterForm是聚合关系因为是可以替换的。比如说你可以使用Oracle的以后扩展成Mysql的那么可以方便替换。

考虑到今后会扩展UserDAO所以适用了接口。

IUserDAO为什么与UserDTO是依赖关系,因为IUserDAO要把用户信息保存到数据库中那么必须需要用户信息。如果没有了用户信息此工作无法完成所以是依赖关系。

 

四、结尾

类之间的关系是本章节的重难点,比较难以理解和区分:

类图怎么springboot 类图怎么画uml_修饰符_19