UML(Unified modeling language)统一建模语言 |
---|
- 一种用于软件系统分析和设计的语言工具,用于帮助软件开发人员进行思考和记录思路的结果
- 本身是一套符号的规定,像数学和化学符号一样的功能,只不过UML符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等。
- 使用UML来建模,常用工具有Rational Rose,也可以使用一些插件来建模(下面推荐IDEA的插件)
PlantUML 中文官方文档(主要看类图):https://plantuml.com/zh/ |
---|
如何创建 |
---|
一、符号解析
1.类、抽象类、接口、枚举、文本
@startuml
'https://plantuml.com/class-diagram
'定义抽象类
abstract class AbstractList
'定义抽象类
abstract AbstractCollection
'定义接口'
interface List
interface Collection
'给一段文本,定义为N2
note "(<|--)此箭头符号表示泛化(继承)." as N2
'N2通过泛化符号指向List
List <|-- N2
'AbstractList通过没有箭头的线指向N2
N2 -- AbstractList
note right of List : 在指定目标右边的文本.
Collection <|-- AbstractCollection
Collection <|- List
AbstractCollection <|- AbstractList
AbstractList <|-- ArrayList
'定义类,和属性
class ArrayList {
Object[] elementData
size()
}
'定义枚举
enum TimeUnit {
DAYS
HOURS
MINUTES
}
@enduml
2. 关联符号
@startuml
'https://plantuml.com/class-diagram
class A
class B
A -- B
class C
note "此线条表示关联" as N
class D
C--N
D--N
@enduml
3. 依赖符号(一个类使用了另一个类就是依赖)
@startuml
'https://plantuml.com/class-diagram
class A
class B
A <.. B
class C
note "此线条表示依赖" as N
class D
C<..N
D..N
@enduml
4. 实现(一个类实现了某个接口)
@startuml
'https://plantuml.com/class-diagram
interface A
class B
A <|.. B
interface C
note "此线条表示实现" as N
class D
C<|..N
D..N
@enduml
5. 泛化符号(表示继承)
@startuml
'https://plantuml.com/class-diagram
class A
class B
A <|-- B
class C
note "此线条表示实现" as N
class D
C<|--N
D--N
@enduml
6. 聚合和组合
@startuml
'https://plantuml.com/class-diagram
class A
class B
A o-- B
class C
note "此线条表示聚合" as N
class D
C o--N
D--N
class E
class F
E *-- F
class G
note "此线条组合" as S
class H
G*--S
H--S
@enduml
二、类图的关系
1. 依赖关系
- 只要类中用到了对方,就称之为依赖
- B类是A类的一个成员属性,则A类依赖B
- B类是A类的方法返回值类型,则A类依赖B类
- B类是A类方法的参数,则A类依赖B类
- A类方法中用到B类,则A类依赖B类
@startuml
'https://plantuml.com/class-diagram
class B
class Person
class IDCard
class A{
'b:B表示声明B类型变量b
b:B
'void save(Person person)
save(person:Person):void
'IDCard getIDCard(Integer personId)
getIDCard(personId:Integer):IDCard
}
A ..> B
A ..> Person
A ..> IDCard
@enduml
2. 泛化/继承关系
- A extends B类,则A 继承/泛化 B
@startuml
'https://plantuml.com/class-diagram
class B{
save():void
}
'A类继承B类
class A extends B{
'void save(Person person)
save(person:Person):void
}
@enduml
3. 实现关系
- A类实现接口C,则A实现C
@startuml
'https://plantuml.com/class-diagram
interface C{
save(person:Person)):void
}
'A类实现C接口
class A implements C{
'void save(Person person)
save(person:Person):void
}
@enduml
4. 关联关系
- 类与类之间的联系,依赖关系的特例
- 关联具有导航性:即双向关系或单向关系
- 关系具有多重性:如"1"(表示有且仅有一个),“0…”(表示0个或多个),“0,1”(表示0个或1个),“n…m”(表示n得到m个都可以),“m…*”(表示至少m个)
单向关系(以1对1为例) |
---|
@startuml
'https://plantuml.com/class-diagram
class B
'A类继承B类
class A{
}
A "1"-->"1" B : "单向一对一关系"
@enduml
双向一对一关系 |
---|
@startuml
'https://plantuml.com/class-diagram
class B
'A类继承B类
class A{
}
A "1"--"1" B : " 双向一对一关系"
@enduml
5. 聚合关系
- 表示
整体和部分的关系,整体与部分可以分开
。聚合关系是关联关系的特例,具有关联的导航性和多重性。- 一台电脑,由键盘、显示器、鼠标等组成;组成电脑的各个配件都可以从电脑上分离,使用带空心菱形实线表示
- 通俗的讲就是,A类使用B类,B类是A类的一部分,这部分可以与A类分开写,那么就是聚合关系
@startuml
'https://plantuml.com/class-diagram
class B
'A类继承B类
class A{
private B b;
}
B --o A : B聚合到A中
@enduml
6. 组合关系
- 表示整体和部分的关系,整体与部分
不可以分开
- 比如一台电脑,有主板,内存,CPU,这些东西
丢失一个,都不能正常运行
我们的计算机- 这种关系为组合关系
@startuml
'https://plantuml.com/class-diagram
class B
'A类继承B类
class A{
private B b = new B();
}
B --* A :" B组合到A中,当A类创建,B类会直接通过new创建,\n 当A类销毁,里面的变量b指向的B类实例也会销毁"
@enduml
三、实际案例
@startuml
package "factory.easy_factory.tradition.pizza"{
abstract class Pizza{
protected String name;
public abstract void prepare();
public void bake()
public void cut()
public void box()
public void setName(String name)
}
note top: Pizza抽象类
note left of Pizza::name
名字
end note
note left of Pizza::prepare
准备原材料,
不同Pizza不一样
因此,做成抽象方法
end note
class CheessPizza<extends Pizza>{
@Override void prepare()
}
class GreekPizza<extends Pizza>{
@Override void prepare()
}
Pizza <|-- GreekPizza
Pizza <|--CheessPizza
}
package "factory.easy_factory.tradition.order"{
class OrderPizza{
OrderPizza()
}
note top: 订购Pizza类,根据用户需要的披萨\n动态调用不同实现类
OrderPizza .right.> Pizza
OrderPizza ...> CheessPizza
OrderPizza ...> GreekPizza
class PizzaShop
note left: 披萨商店\n 需要下订单
PizzaShop .right.> OrderPizza
}
@enduml