PlantUML对象图
1、对象图的基本概念
对象图是系统静态结构的一个快照。
1.1、对象图的定义
一个类图仅仅显示的是系统中的类,但是存在一个变量,确定地显示各个类的真实对象实例的位置,那就是对象图。对象图描述系统在某一个特定时间点上的静态结构,是类图的实例和快照,即类图中的各个类在某一个时间点上的实例及其关系的静态写照。
对象图中包含对象(Object)和链(Link)。其中对象是类的特定实例,链是类之间关系的实例,表示对象之间的特定关系。对象图的表示如图所示。

对象图所建立的对象模型描述的是某种特定的情况,而类图所建立的模型描述的是通用的情况。类图和对象图的区别比较见表所示。

1.2、对象图的作用
对象图作为系统在某一时刻的快照,是类图中的各个类在某一个时间点上的实例及其关系的静态写照,可以通过以下方面来说明它的作用:
- 说明复杂的数据结构。使用对象描绘对象之间的关系有助于说明复杂的数据结构在某一时刻的快照,从而有助于对复杂数据结构的抽象。
- 表示快照中的行为。通过一系列的快照,可以有效地描述事物的行为。
2、对象图的组成
对象图(Object Diagram)是由对象(Object)和链(Link)组成的。对象图的目的在于描述系统中参与交互的各个对象在某一时刻是如何运行的。
2.1、对象
对象是类的实例,创建一个对象通常可以分两种情况来观察:第一种情况是将对象作为一个实体,它在某个时刻有明确的值;另一种情况是作为一个身份持有者,不同时刻有不同的值。一个对象在系统的某一个时刻应当有其自身的状态,通常这个状态使用属性的赋值,或在分布式系统中的位置来描述对象并通过链和其他对象相联系。
对象可以通过声明的方式拥有唯一的引用句柄,句柄可标识对象和提供对对象的访问,代表了对象拥有唯一的身份。对象通过唯一的身份与其他对象相联系,彼此交换消息。对象不仅可以是一个类的直接实例,如果执行环境允许多重类元,则可以是多个类的直接实例。对象也拥有直属和继承操作,可以调用对象去执行任何直属类的完整描述中的任何操作。对象也可以作为变量和参数的值,变量和参数的类型被声明为与对象相同的类或该对象直属类的一个祖先类,它的存在可简化编程语言完整性的实施。
对象在某一时刻,其属性都是有相关赋值的,在对象的完整描述中,每一个属性都有一个属性槽,即每一个属性在它的直属类和每一个祖先类中都进行了声明。当对象的实例化和初始化完成后,每个槽中都有了一个值,它是所声明属性类型的一个实例。在系统运行中,槽中的值可以根据对象所需要满足的各种限制进行改变。如果对象是多个类的直接实例,则在对象的直属类中和对象的任何祖先类中声明的每一个属性在对象中都有一个属性槽。相同属性不可以多次出现,但如果两个直属类是同一祖先的子孙,则不论通过何种路径到达该属性,该祖先类的每个属性只有一个备份被继承。
在一些编程语言中支持动态类元,这时对象就可以在执行期间通过更改直属类的操作,来指明属性值改变它的直属类,并在这个过程中获得属性。如果编程语言同时允许多类元和动态类元,则在执行过程中可以获得和失去直属类,如C++等。
由于对象是类的实例,对象的表示符号使用与类相同的符号作为描述符,但对象使用带有下划线的实例名将它自己作为实体区分开来。顶部显示对象名和类名,并以下划线标识出来,使用的语法是"对象名:类名",底部包含属性名和值的列表。在Rational Rose 2007中,不显示属性名和值的列表,但可以只显示对象名称,不显示类名,并且对象的符号图形与类图中的符号图形类似,如图所示。
对象也有其他一些特殊的形式,如多对象和主动对象等。多对象表示多个对象的类元角色。多对象通常位于关联关系的"多"端,表明操作或信号是应用在一个对象集而不是单个对象上的,多对象的图形表示形式如图所示。主动对象是拥有一个进程(或线程)并能启动控制活动的一种对象,它是主动类的实例。


2.2、链(Link)
链是两个或多个对象之间的独立连接,它是对象引用元组(有序表),是关联的实例。对象必须是关联中相应位置类的直接或间接实例。一个关联不能有来自同一关联的迭代连接,即不能有两个相同的对象引用元组。
链可以用于导航,连接一端的对象可以得到另一端的对象,也就可以发送消息(称通过联系发送消息)。如果连接对目标方向有导航性,这一过程就是有效的。如果连接是不可导航的,访问可能有效也可能无效,但消息发送通常是无效的,相反方向的导航另外定义。
在UML中,链的表示形式为一个或多个相连的直线或弧线。在有自身相关联的类中,链是两端指向同一对象的回路。如图所示,是链的普通关联和自身关联的表示形式。

3、PlantUML语法
3.1、对象的定义
使用关键字 object 定义实例。
js
@startuml
object 对象1
object "第 2 个对象" as o2
@enduml

3.2、对象之间的关系
对象之间的关系是用以下符号定义的。
| 类型 | 符号 | 目的 |
|---|---|---|
| 扩展 | `< | --` |
| 实现 | `< | ..` |
| 构成 | *-- |
没有整体就没有部分 |
| 聚合 | o-- |
部分可以独立于整体而存在 |
| 依赖性 | --> |
对象使用另一个对象 |
| 依赖 | ..> |
较弱的依赖形式 |
可以用.. 替换-- ,以获得虚线。
知道了这些规则,就有可能画出下面的图画。
可以在关系上添加一个标签,使用: ,后面是标签的文字。
对于 cardinality,你可以在关系的每一侧使用双引号"" ,。
js
@startuml
object Object01
object Object02
object Object03
object Object04
object Object05
object Object06
object Object07
object Object08
Object01 <|-- Object02
Object03 *-- Object04
Object05 o-- "4" Object06
Object07 .. Object08 : some labels
@enduml

3.3、关联对象
js
@startuml
object o1
object o2
diamond dia
object o3
o1 --> dia
o2 --> dia
dia --> o3
@enduml

3.4、添加属性
用冒号加属性名的形式声明属性。
js
@startuml
object user
user : name = "Dummy"
user : id = 123
@enduml

也可以用大括号批量声明属性。
js
@startuml
object user {
name = "Dummy"
id = 123
}
@enduml

3.5、类图中的通用特性
- 可见性
- 定义注释
- 使用包
- 美化输出内容