• 【入门篇】UML-ClassDiagram类图


    一、 UML基本使用

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

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

    使用classDiagram开启类图编辑

    1. 定义一个类

    ① 使用class关键字

    语法:class 类名

    如:class Employee

    2. 定义类的方法与属性

    • ① 方式一

    语法:

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

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

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

    1. classDiagram
    2. class Employee
    3. Employee : +String name
    4. Employee : +String password
    5. Employee : +setLeader(Employee leader) Employee

    c0db27f8beba4f0687cb1382349cd255.png

     

     

    • ② 方式二

    语法:

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

    1. classDiagram
    2. class Employee{
    3. +String name
    4. -Integer age
    5. #String password
    6. +setLeader(Employee leader) Employee
    7. }

    600358467a73497faf10ed20b98b462c.png

     

    3. 返回类型

    语法:

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

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

    语法:

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

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

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

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

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

    符号含义
    +Public
    -Private
    #Protected
    ~Package/Internal

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

    符号含义
    *abstract
    $static

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

    6. 关系描述

    TypeDescription
    <|--Inheritance 继承
    *--Composition 组合
    o--Aggregation 聚合
    -->Association 关联
    --Link (Solid) 连接实线
    ..>Dependency 依赖
    ..|>Realization 实现
    ..Link (Dashed) 连接虚线

     

    1. classDiagram
    2. classA --|> classB : Inheritance
    3. classC --* classD : Composition
    4. classE --o classF : Aggregation
    5. classG --> classH : Association
    6. classI -- classJ : Link(Solid)
    7. classK ..> classL : Dependency
    8. classM ..|> classN : Realization
    9. classO .. classP : Link(Dashed)

     

    54807bfcda024f93bf699146eaa31b95.png

     

    0c87625038964e6db4d5d58c5195d4c1.png

     

    7. 关系标签

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

    如:classA --|> classB : Inheritance

    8. 类修饰

    TypeDescription
    <>接口
    <>抽象类
    <>枚举类
    1. classDiagram
    2. class Shape<<interface>>{
    3. noOfVertices
    4. draw()
    5. }

     4e66f5c6089d430a80a7b6a8afef376c.png

     

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

    1. @startuml
    2. class Color <<enumeration>>{
    3. RED
    4. BLUE
    5. GREEN
    6. WHITE
    7. BLACK
    8. }
    9. @enduml

     ddd84d23f77b406da97504defaf88d6c.png

     

    9. 注释

    语法:%% 注释内容

    1. classDiagram
    2. %% This whole line is a comment classDiagram class Shape <<interface>>
    3. class Shape{
    4. <<interface>>
    5. noOfVertices
    6. draw()
    7. }

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

    1. @startuml
    2. class Object << general >>
    3. Object <|--- ArrayList
    4. note top of Object : In java, every class\nextends this one.
    5. note "This is a floating note" as N1
    6. note "This note is connected\nto several objects." as N2
    7. Object .. N2
    8. N2 .. ArrayList
    9. class Foo
    10. note left: On last defined class
    11. @enduml

     

    86353a0e6aab4dd7bec171bee028f448.png

     

     

    二、 类与类之间的关系

    1. 关联关系

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

    • ① 单向关联

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

    1. classDiagram
    2. class User{
    3. -Address address
    4. }
    5. class Address
    6. User --> Address

     

    abd4d35c795b4fc4abfbd8bb6626c14c.png

    • ② 双向关联

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

    1. classDiagram
    2. class User{
    3. -List~Order~ orders
    4. }
    5. class Order{
    6. -User user
    7. }
    8. User <--> Order

    6f361f0c1e454478be344be0818f2d55.png

     

    • ③ 自关联

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

    1. classDiagram
    2. class TreeNode{
    3. -int val
    4. -TreeNode left
    5. -TreeNode right
    6. }
    7. TreeNode --> TreeNode

    812011bd9350440290be70f9eeac2400.png

     

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

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

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

     

    1. classDiagram
    2. class Dish
    3. class SetMeal{
    4. -List~Dish~ dishes
    5. }
    6. SetMeal o-- Dish

     

    55df5e50c19641e788b7187462b57e30.png

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

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

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

    1. classDiagram
    2. class Node
    3. class LinkedList{
    4. -List~Node~ nodes
    5. }
    6. LinkedList *-- Node

    43fa268ecf68478a965aa9e4aa252d98.png

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

    4. 依赖关系

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

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

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

    1. classDiagram
    2. class Collection{
    3. <<Interface>>
    4. +iterator() Iterator~E~
    5. }
    6. class Iterator~E~{
    7. <<Interface>>
    8. +hasNext() boolean
    9. +next() E
    10. }
    11. Collection ..> Iterator

     4d0e63370dcb4e9092344e5387296b79.png

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

    5. 继承关系

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

    LinkedHashSet类继承HashSet类,如下:

    1. classDiagram
    2. class HashSet
    3. class LinkedHashSet
    4. HashSet <|-- LinkedHashSet

     

    51d46447960f4730845bbf3c428a3a1f.png

    6. 实现关系

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

    ArrayList类实现List接口,如下:

    1. classDiagram
    2. class List~E~{
    3. <<Interface>>
    4. }
    5. class ArrayList~E~
    6. List <|.. ArrayList

     474dd9e5daa1466e85ec3f68d32dd987.png

     

    三、综合案例

     

    1. @startuml
    2. class UserDTO{
    3. - userAccount: String
    4. - userPassword: String
    5. + getUserAccount(): String
    6. + setUserAccount(String userAccount): void
    7. + getUserPassword(): String
    8. + setUserPassword(String userPassword): void
    9. # getUser(): UserDTO
    10. }
    11. class RegisterForm{
    12. - user: UserDTO
    13. - userDao: IUserDAO
    14. }
    15. class IUserDAO<<interface>>{
    16. +addUser(UserDTO user): Boolean
    17. }
    18. class OracleUserDAO{
    19. +addUser(UserDTO user): Boolean
    20. }
    21. IUserDAO <|.. OracleUserDAO: 实现Realization
    22. RegisterForm o--> IUserDAO: 聚合Aggregation
    23. RegisterForm *--> UserDTO: 组成Composition
    24. IUserDAO --> UserDTO: 关联Link(Solid)
    25. @enduml

    语雀 文本绘图 PlantUML绘图效果

    5bbdc71d127c4db29482c072c879568f.png

     

    Inteilj IDEA PlantUML 插件绘图效果

    0d91901802814d5c99c5f81d906caedc.png

     

    1. classDiagram
    2. class UserDTO{
    3. - userAccount: String
    4. - userPassword: String
    5. + getUserAccount(): String
    6. + setUserAccount(String userAccount): void
    7. + getUserPassword(): String
    8. + setUserPassword(String userPassword): void
    9. # getUser(): UserDTO
    10. }
    11. class RegisterForm{
    12. - user: UserDTO
    13. - userDao: IUserDAO
    14. }
    15. class IUserDAO{
    16. <<interface>>
    17. +addUser(UserDTO user): Boolean
    18. }
    19. class OracleUserDAO{
    20. +addUser(UserDTO user): Boolean
    21. }
    22. IUserDAO <|.. OracleUserDAO: 实现Realization
    23. RegisterForm o--> IUserDAO: 聚合Aggregation
    24. RegisterForm *--> UserDTO: 组成Composition
    25. IUserDAO --> UserDTO: 关联Link(Solid)

    Typro 纯文本绘图效果

    83fe646e71644f25a1bf1984da0a0a34.png

     

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

     

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

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

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

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

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

     

    四、结尾

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

    28a27724ada645d3ac0168b70fee043e.png

     

     

     

     

  • 相关阅读:
    新手如何使用Cheat Engine (CE) 来修改“我的世界“?
    Java多线程-线程创建的3种方式
    猿创征文|Docker部署Oracle 19C及最佳实践
    预测评价指标
    回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测
    [hive]搭建hive3.1.2hiveserver2高可用可hive metastore高可用
    『C语言进阶』指针进阶(一)
    HarmonyOS基础组件之Button三种类型的使用
    Java中根据中文汉字获取首字母
    数字化转型的失败原因及成功之道
  • 原文地址:https://blog.csdn.net/weixin_52894047/article/details/126453102