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

语法:
class 类名{
修饰符 属性
修饰符 方法 返回值
}
- classDiagram
- class Employee{
- +String name
- -Integer age
- #String password
-
- +setLeader(Employee leader) Employee
- }

3. 返回类型
语法:
修饰符 方法(参数) 返回值
4. 泛型(使用~~包裹)
语法:
修饰符 方法(参数类型泛型 参数名) 返回值
如:+setLeaders(List~Employee~ leaders) List~Employee~
表示 public List方法
5. 可见性(访问修饰符)
访问修饰符需要与被修饰的方法或者属性一起使用,中间不能有space空格
| 符号 | 含义 |
|---|---|
| + | Public |
| - | Private |
| # | Protected |
| ~ | Package/Internal |
抽象、静态的表示会有不同,这两个符号需要在方法的)后面紧跟,不能有space空格。不能修饰属性
| 符号 | 含义 |
|---|---|
| * | abstract |
| $ | static |
显示上,抽象方法会有下划线,静态方法则表现为斜体。
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)


7. 关系标签
语法:[类A][关系描述][类B] : 标签描述
如:classA --|> classB : Inheritance
8. 类修饰
| Type | Description |
|---|---|
< | 接口 |
< | 抽象类 |
< | 枚举类 |
- classDiagram
- class Shape<<interface>>{
- noOfVertices
- draw()
- }

枚举类会稍微特殊一些,如下:
- @startuml
- class Color <<enumeration>>{
- RED
- BLUE
- GREEN
- WHITE
- BLACK
- }
- @enduml

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

1. 关联关系
简言之:一个类中存在一个属性是另一个类。
表示一个User用户类,包含一个属性是Address地址类,如下:
- classDiagram
- class User{
- -Address address
- }
- class Address
- User --> Address

表示User用户类内部包含Order属性,Order订单类内部包含User属性,如下:
- classDiagram
- class User{
- -List~Order~ orders
- }
- class Order{
- -User user
- }
- User <--> Order

表示TreeNode二叉树类包含TreeNode属性,如下:
- classDiagram
- class TreeNode{
- -int val
- -TreeNode left
- -TreeNode right
- }
- TreeNode --> TreeNode

2. 聚合关系(强关联关系)
简言之:整体与部分之间的关系,部分可以单独存在。
表示SetMeal套餐类聚合了Dish菜品类,如下:
- classDiagram
- class Dish
- class SetMeal{
- -List~Dish~ dishes
- }
- SetMeal o-- Dish

3. 组合关系(强聚合关系)
简言之:整体与部分之间的关系,部分不能单独存在。
表示LinkedList类组合了Node类,Node类不能单独存在,如下:
- classDiagram
- class Node
- class LinkedList{
- -List~Node~ nodes
- }
- LinkedList *-- Node

注意:此处这个例子不是非常恰当,暂时没有找到合适的例子。
4. 依赖关系
简言之:某个类与另一个类之间存在使用关系。
某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法。
Collection内部使用Iterator的方法(具体可见Collection接口的实现类),如下:
- classDiagram
- class Collection{
- <<Interface>>
- +iterator() Iterator~E~
- }
- class Iterator~E~{
- <<Interface>>
- +hasNext() boolean
- +next() E
- }
- Collection ..> Iterator

注意:此处可以看ArrayList类,以及其内部Itr类。
5. 继承关系
简言之:父类与子类的关系。
LinkedHashSet类继承HashSet类,如下:
- classDiagram
- class HashSet
- class LinkedHashSet
- HashSet <|-- LinkedHashSet

6. 实现关系
简言之:接口与实现类的关系。
ArrayList类实现List接口,如下:
- classDiagram
- class List~E~{
- <<Interface>>
- }
- class ArrayList~E~
- List <|.. ArrayList

- @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绘图效果

Inteilj IDEA PlantUML 插件绘图效果

- 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 纯文本绘图效果

用户通过注册界面(RegisterForm)输入个人信息, 用户点击“注册”按钮后将输入的信息通过一个封装用户输入数据的对象(UserDTO)传递给操作数据库的数据访问类(DAO), 为了提高系统的扩展性,针对不同的数据库可能需要提供不同的数据访问类,因此提供了数据访问类接口, 如IUserDAO,每一个具体数据访问类都是某一个数据访问类接口的实现类, 如OracleUserDAO就是一个专门用于访问Oracle数据库的数据访问类。
UserDTO只是把userAcount,userPassword封装了一下使用了Getter,Setter。
那么肯定是RegisterForm的成员,注册窗体不能没有用户名与密码信息所以是组合关系。RegisterForm没有了用户信息(UserDTO)那么就没有意义了。
然后IUserDAO与RegisterForm是聚合关系因为是可以替换的。比如说你可以使用Oracle的以后扩展成Mysql的那么可以方便替换。
考虑到今后会扩展UserDAO所以适用了接口。
IUserDAO为什么与UserDTO是依赖关系,因为IUserDAO要把用户信息保存到数据库中那么必须需要用户信息。如果没有了用户信息此工作无法完成所以是依赖关系。
类之间的关系是本章节的重难点,比较难以理解和区分:
