【入门篇】UML-ClassDiagram类图

一、 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

c0db27f8beba4f0687cb1382349cd255.png

 

 

  • ② 方式二

语法:

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

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

600358467a73497faf10ed20b98b462c.png

 

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. 关系描述

TypeDescription
<|--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)

 

54807bfcda024f93bf699146eaa31b95.png

 

0c87625038964e6db4d5d58c5195d4c1.png

 

7. 关系标签

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

如:classA --|> classB : Inheritance

8. 类修饰

TypeDescription
<<Interface>>接口
<<abstract>>抽象类
<<enumeration>>枚举类
classDiagram
class Shape<<interface>>{
    noOfVertices
    draw()
}

 4e66f5c6089d430a80a7b6a8afef376c.png

 

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

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

 ddd84d23f77b406da97504defaf88d6c.png

 

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

 

86353a0e6aab4dd7bec171bee028f448.png

 

 

二、 类与类之间的关系

1. 关联关系

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

  • ① 单向关联

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

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

 

abd4d35c795b4fc4abfbd8bb6626c14c.png

  • ② 双向关联

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

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

6f361f0c1e454478be344be0818f2d55.png

 

  • ③ 自关联

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

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

812011bd9350440290be70f9eeac2400.png

 

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

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

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

 

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

 

55df5e50c19641e788b7187462b57e30.png

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

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

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

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

43fa268ecf68478a965aa9e4aa252d98.png

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

4. 依赖关系

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

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

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

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

 4d0e63370dcb4e9092344e5387296b79.png

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

5. 继承关系

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

LinkedHashSet类继承HashSet类,如下:

classDiagram
    class HashSet
    class LinkedHashSet
    HashSet <|-- LinkedHashSet

 

51d46447960f4730845bbf3c428a3a1f.png

6. 实现关系

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

ArrayList类实现List接口,如下:

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

 474dd9e5daa1466e85ec3f68d32dd987.png

 

三、综合案例

 

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

5bbdc71d127c4db29482c072c879568f.png

 

Inteilj IDEA PlantUML 插件绘图效果

0d91901802814d5c99c5f81d906caedc.png

 

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

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

 

 

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeekerLou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值