常用UML图及PlantUML代码画图:识别参与者和用例及类图
识别参与者和用例
要获取系统参与者可以在与客户沟通时,询问用户一些问题来识别角色。可以参考下列问题:
- 谁将使用系统的主要功能?
- 是需要系统的支持以完成日常工作?
- 谁负责维护、管理系统并保持系统正常运行?
- 系统需要与哪些外部系统交互?
- 系统需要处理哪些硬件设备?
- 谁对系统运行产生的结果比较感兴趣?
注意:
- 只要是参与者,对于子系统而言都是外部的。
- 参与者直接与系统进行交互。
- 参与者指的与系统直接交互时所扮演的角色,而不是特定的人或事物。比如,不是甲乙丙丁与教务系统产生交互而是学生与教务系统产生交互。
当我们获取到系统参与者后,我们可以通过参与者来列出它的用例。可以通过回答下列问题来识别用例:
- 每个参与者执行的操作有什么?
- 参与者要向系统请求什么功能?
- 每个参与者的特定任务是什么?
- 什么参与者将要创建、存储、改变、删除或者读取系统中的信息?
- 什么用例会创建、存储、改变、删除或读取这个信息?
- 参与者需要通知外部系统的突然变化嘛?
- 系统需要通知参与者正在发生的事情吗?
- 什么用例将支持和维护系统?
注意:
- 每个用例至少有一个参与者。
- 每个参与者至少一个用例。
- 如果存在没有参与者的用例,再三检查后,还是没有参与者,可以考虑把该用例并入其他用例中。
- 如果存在没有用例的参与者,再三检查后,该参与者还是没有用例,可以考虑该参与者是如何与系统产生交互的,或由该参与者确定一个新的用例,或实际上该参与者本身就是多余的。
类图
目的
用来表示类、接口以及它们之间的静态结构和关系。
类图经常与ER图被混为一谈,但实际上,类图主要是描述程序实现时对象的设计和继承实现关系,在类图中完全无需考虑持久层的存在,只需设计好交互即可。而ER图时持久层即数据库的直接体现,它显示这些数据之间的关联,只存在属性,不包含方法。
概念
类图是一切面向对象方法的核心建模工具。类图描述了系统中对象的类型以及它们之间存在的各种静态关系。
符号
泛化(Generalization)
是一种继承关系,表示子类继承父类的所有特征和行为。
图例
带三角箭头的实线,箭头指向父类。
代码示例
```plantuml
@startuml
class Shape {
- posX: int
- posY: int
+ display(): void
}
class Circle {
- radius: int
}
' Circle类继承Shape类,且使用left将Shape对象放置左侧
Circle -left-|> Shape
@enduml
```
实现(Realization)
是一种类与接口的关系,表示类是接口所有特征和行为的实现。
图例
带三角箭头的虚线,箭头指向接口。
代码示例
```plantuml
left to right direction
interface IPay {
+ pay(): boolean
}
class AliPay {
+ pay(): boolean
}
IPay <|.. AliPay
```
依赖(Dependency)
是一种使用关系,即一个类的实现需要另一个类的协助。
图例
带普通箭头的虚线,普通箭头指向被使用者。
代码示例
```plantuml
left to right direction
class Driver {
+ driving(car: Car): void
}
class Car {
+ driving(): void
}
Driver ..> Car
```
关联(Association)
是一种拥有关系,它使得一个类知道另一个类的属性和方法。如,B类是A类的成员变量。
图例
带普通箭头的实线,指向被拥有者。双向的关联可以有两个箭头,或者没有箭头。单向的关联有一个箭头。
代码示例
```plantuml
left to right direction
class People {
- myCar: Car
+ driving(): void
}
class Car {
+ driving(): void
}
People --> Car
```
双向关联
默认情况下,关联是双向的。例如:顾客(Customer)购买商品(Product)并拥有商品,反之,卖出的商品总有某个顾客与之相关联。因此,Customer类和Product类之间具有双向关联关系。
图例
代码示例
```plantuml
left to right directio
class Customer {
- products: Product[]
}
class Product {
- customer: Customer
}
Customer "购买 >" ---- "< 被卖给" Product
```
单项关联
类的关联关系也可以是单向的,单向关联用带箭头的实线表示。例如:顾客(Customer)拥有地址(Address),则Customer类与Address类具有单向关联关系。
图例
代码示例
```plantuml
left to right direction
class Customer {
- address: Address
}
class Address {
}
Customer --> Address: > 拥有
```
自关联
在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。例如:单例模式,树、图节点。
图例
代码示例
```plantuml
left to right direction
class Node {
- subNode: Node
}
Node --> Node: 包含
```
多重性关联
多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
例如:一个界面(Form)可以拥有零个或多个按钮(Button),但是一个按钮只能属于一个界面,因此,一个Form类的对象可以与零个或多个Button类的对象相关联,但一个Button类的对象只能与一个Form类的对象关联。
图例
代码示例
```plantuml
left to right direction
class Form {
- buttons: Button[]
}
class Button {
}
Form "1..1"---> "0..*" Button
```
聚合(Aggregation)
是一种整体与部分的关系。且部分可以离开整体而单独存在。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
图例
带空心菱形的实线,空心菱形指向整体。
代码示例
```plantuml
left to right direction
class Computer {
- keyboard: Keyboard
+ input(): void
}
class Keyboard {
+ intput(): void
}
Computer o-- Keyboard
```
组合(Composition)
是一种整体与部分的关系。但部分不能离开整体而单独存在,组合关系是关联关系的一种,是比聚合关系还要强的关系。
图例
带实心菱形的实线,实心菱形指向整体。
代码示例
```plantuml
left to right direction
class Bird {
- wing: Wing
+ fly(): void
}
class Wing {
+ fly(): void
}
Bird *-- Wing
```
组合与聚合区别
例如:一个公司拥有多个部门,公司和部门之间是组合关系,公司破产了,部门就不复存在了。部门和员工是聚合关系,部门被裁掉,员工就换下家了。