首页 > 技术文章 > 练习UML类图中的类的表示

Lilith404 2019-03-27 21:48 原文

第一部分:UML类图(class diagram)

类图用来展现一组类、类的特性以及其类相互之间的关系,一个类图由一组类以及它们之间的关系构成,类图用来对系统的领域概念以及静态结构进行建模。

在软件模型中,类图是最基本、也最重要的一种图。

类图中的元素有类、接口、协作、关系、注释、约束和包。

类的关系主要有关联、组成、泛化、依赖和接口的实现。

类图的作用主要有以下三点:

  • 在软件空间中建立对问题空间抽象的结构映像。
  • 用例分析和设计的逻辑结构建模。
  • 数据库结构建模。

第二部分:PlantUML类图语法

基本语法:

类之间的关系通过下面的符号定义 :

Type Symbol Drawing
Extension(扩展) <|--

 

Composition(组合) *--  

 

Aggregation(聚合) o--  

 

 

 

 

 

 

 

 

 

 

使用.. 来代替 -- 可以得到点 线.

 例如:

1 @startuml
2 Class01 <|-- Class02
3 Class03 *-- Class04
4 Class05 o-- Class06
5 Class07 .. Class08
6 Class09 -- Class10
7 @enduml

1 @startuml
2 Class11 <|.. Class12
3 Class13 --> Class14
4 Class15 ..> Class16
5 Class17 ..|> Class18
6 Class19 <--* Class20
7 @enduml

1 @startuml
2 Class21 #-- Class22
3 Class23 x-- Class24
4 Class25 }-- Class26
5 Class27 +-- Class28
6 Class29 ^-- Class30
7 @enduml

在关系之间使用标签来说明时, 使用 :后接 标签文字。

对元素的说明,你可以在每一边使用 "" 来说明.例如:

1 @startuml
2 
3 Class01 "1" *-- "many" Class02 : contains
4 
5 Class03 o-- Class04 : aggregation
6 
7 Class05 --> "1" Class06
8 
9 @enduml

在标签的开始或结束位置添加<>以表明是哪个对象作用到哪个对象上。

1 @startuml
2 class Car
3 
4 Driver - Car : drives >
5 Car *- Wheel : have 4 >
6 Car -- Person : < owns
7 
8 @enduml

添加方法:

为了声明域或者方法,你可以使用 后接域名或方法名。

系统检查是否有括号来判断是方法还是域。例如:

1 @startuml
2 Object <|-- ArrayList
3 
4 Object : equals()
5 ArrayList : Object[] elementData
6 ArrayList : size()
7 
8 @enduml

也可以使用{} 把域或者方法括起来。注意,这种语法对于类型/名字的顺序是非常灵活的。

@startuml
class Dummy {
  String data
  void methods()
}

class Flight {
   flightNumber : Integer
   departureTime : Date
}
@enduml

1 @startuml
2 class Dummy {
3   {field} A field (despite parentheses)
4   {method} Some method
5 }
6 
7 @enduml

定义可访问性:

一旦你定义了域或者方法,你可以定义 相应条目的可访问性质。

Character Icon for field Icon for method Visibility
- private
# protected
~ package private
+ public

 

 

 

 

 

 

 1 @startuml
 2 
 3 class Dummy {
 4  -field1
 5  #field2
 6  ~method1()
 7  +method2()
 8 }
 9 
10 @enduml

你可以采用以下命令停用这些特性 skinparam classAttributeIconSize 0

 1 @startuml
 2 skinparam classAttributeIconSize 0
 3 class Dummy {
 4  -field1
 5  #field2
 6  ~method1()
 7  +method2()
 8 }
 9 
10 @enduml

抽象与静态:

通过修饰符{static}或者{abstract},可以定义静态或者抽象的方法或者属性。这些修饰符可以写在行的开始或者结束。也可以使用{classifier}这个修饰符来代替{static}.

1 @startuml
2 class Dummy {
3   {static} String id
4   {abstract} void methods()
5 }
6 @enduml

高级类体:

PlantUML默认自动将方法和属性重新分组,你可以自己定义分隔符来重排方法和属性,下面的分隔符都是可用的:--..==__.

还可以在分隔符中添加标题:

@startuml
class Foo1 {
  You can use
  several lines
  ..
  as you want
  and group
  ==
  things together.
  __
  You can have as many groups
  as you want
  --
  End of class
}

class User {
  .. Simple Getter ..
  + getName()
  + getAddress()
  .. Some setter ..
  + setName()
  __ private data __
  int age
  -- encrypted --
  String password
}

@enduml

备注和模板:

模板通过类关键字("<<"和">>")来定义

你可以使用note left of , note right of , note top of , note bottom of这些关键字来添加备注。

你还可以在类的声明末尾使用note left, note right,note top, note bottom来添加备注。

此外,单独用note这个关键字也是可以的,使用 .. 符号可以作出一条连接它与其它对象的虚线。

 链接的注释:

在定义链接之后,你可以用 note on link 给链接添加注释

如果想要改变注释相对于标签的位置,你也可以用 note left on linknote right on linknote bottom on link。(对应位置分别在label的左边,右边,下边)

 抽象类和接口:

 用关键字abstractabstract class来定义抽象类。抽象类用斜体显示。 也可以使用interface, annotationenum关键字。

 使用非字母字符:

 

如果你想在类(或者枚举)的显示中使用非字母字符,你可以:

  • 在类的定义中使用 as 关键字
  • 在类名旁边加上 ""
1 @startuml
2 class "This is my class" as class1
3 class class2 as "It works this way too"
4 
5 class2 *-- "foo/dummy" : use
6 @enduml

 隐藏类:

你也可以使用 show/hide 命令来隐藏类

如果你定义了一个大的!included文件,且想在文件包含之后隐藏部分类,该功能会很有帮助。

 泛型(generics):

 你可以用 <> 来定义类的泛型。

1 @startuml
2 
3 class Foo<? extends Element> {
4   int size()
5 }
6 Foo *- Element
7 
8 @enduml

指定标记(Spot):

通常标记字符 (C, I, E or A) 用于标记 类(classes), 接口(interface), 枚举(enum)和 抽象类(abstract classes).

但是当你想定义原型时,可以增加对应的单个字符及颜色,来定义自己的标记(spot),就像下面一样:

1 @startuml
2 
3 class System << (S,#FF7700) Singleton >>
4 class Date << (D,orchid) >>
5 @enduml

你可以通过关键词 package 声明包,同时可选的来声明对应的背景色(通过使用html色彩代码或名称)。

注意:包可以被定义为嵌套。

 1 @startuml
 2 
 3 package "Classic Collections" #DDDDDD {
 4   Object <|-- ArrayList
 5 }
 6 
 7 package net.sourceforge.plantuml {
 8   Object <|-- Demo1
 9   Demo1 *- Demo2
10 }
11 
12 @enduml

包样式:

包可以定义不同的样式。

你可以通过以下的命令来设置默认样式 : skinparam packageStyle,或者对包使用对应的模板:

 1 @startuml
 2 scale 750 width
 3 package foo1 <<Node>> {
 4   class Class1
 5 }
 6 
 7 package foo2 <<Rectangle>> {
 8   class Class2
 9 }
10 
11 package foo3 <<Folder>> {
12   class Class3
13 }
14 
15 package foo4 <<Frame>> {
16   class Class4
17 }
18 
19 package foo5 <<Cloud>> {
20   class Class5
21 }
22 
23 package foo6 <<Database>> {
24   class Class6
25 }
26 
27 @enduml

你也可以参考下面的示例来定义包之间的连线:

 1 @startuml
 2 
 3 skinparam packageStyle rectangle
 4 
 5 package foo1.foo2 {
 6 }
 7 
 8 package foo1.foo2.foo3 {
 9   class Object
10 }
11 
12 foo1.foo2 +-- foo1.foo2.foo3
13 
14 @enduml

第三部分:以班级学生管理系统中的 —— “学生” 类为例

在班级管理系统中,学生是一个类,与此同时,课程、宿舍、成绩与学生这个类也有着很大的关系。

@startuml
class 课程 {
  -课程号:int
  -课程名:string
  -主课教师:string
  __
  +课程信息
  +选择课程
}
class 学生{
  -学号:int
  -姓名:string
  -班级:string
  -专业:string
  __
  +登陆
  +修改信息
  +退出
  +已选课程
  +课程信息
}
class 宿舍 {
  -宿舍号:int
  -楼号:int
  -所住人员:string
  __
  +登陆
  +修改信息
  +退出
}
class 成绩 {
  -课程号:int
  -课程名:string
  -考试成绩:int
  __
  +课程信息
  +查看成绩
}
课程 -right-> 学生
宿舍 -left-> 学生
学生 -down-> 成绩
@enduml

第四部分:总结

 类通常都是用一个矩形来表示,这个矩形分为三部分,最上面是类名,中间是类的属性,最下面是类的操作。

通过类图,能很清晰的就将系统中的各个类对象都描述清楚,然后再根据这些类图来进行设计就非常的方便。

 同时,也可以通过类图来对与客户的要求进行完善,以免出现软件设计后却不符合客户要求的情况。

 

推荐阅读