一、 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
- ② 方式二
语法:
class 类名{
修饰符 属性
修饰符 方法 返回值
}
classDiagram
class Employee{
+String name
-Integer age
#String password
+setLeader(Employee leader) Employee
}
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)
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要把用户信息保存到数据库中那么必须需要用户信息。如果没有了用户信息此工作无法完成所以是依赖关系。
四、结尾
类之间的关系是本章节的重难点,比较难以理解和区分: