统一建模语言(UML)是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。其重要性就不多言(虽然没见到多少人用,但我仍然认为它很重要,只要大家愿意用,那么它就是一个非常好的工具,也是我写这片文章的重点所在)。
因为本人是开发人员,使用类图比较多,下面主要以类图为例介绍PlantUML的用法。先熟悉一下类图中的六种关系
实现(Realize):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。
uml中用空心箭头和虚线表示实现关系,箭头指向定义约定的元素。
泛化(Generalization):通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。
uml中用带空心箭头的实线线表示泛化关系,箭头指向一般个体。
依赖(Dependency):元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。
uml中用带箭头的虚线表示依赖关系,箭头指向被依赖元素。
特点:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。
关联(Association):元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。
uml中用实线表示关联关系,箭头指向被依赖元素。
特征:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码可以用实例变量来表示。(A类有一个成员变量保存的是B类的一个引用,也就是说由A类可以找到B类)
聚合(Aggregation):关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。
uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。
特征:属于是关联的特殊情况,体现部分-整体关系,是一种弱拥有关系;整体和部分可以有不一样的生命周期;是一种弱关联;
组合(Composition):组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。
uml中用带实心菱形头的实线表示组合关系,菱形头指向整体。
UML的工具很多,但我最喜欢PlantUML。因为PlantUML只需要编写语句而不需要绘图,这意味着可以方便地进行版本控制。
目前PlantUML支持时序图、用例图、类图、活动图、组件图、状态图、对象图。另外配置图和时间图为beta版本。
PlantUML的各类开发插件很多,因为我一般使用Android Studio作为开发工具,所以下面我就用Android Studio上的插件PlantUML integration来做以上六种图的简单演示。
实例是最好的老师,首先来看一张图:
从这张图中可以清楚的看出各个类之间的关系。下面来看一下代码(别头大,真的很简单),注意PlantUML中是以'为注释标记的,已经写了比较详细的注释。(如果看不懂,你可以。。。转行了)
代码:(Markdown的代码标签有点问题,大家凑乎这看吧)
@startuml
'定义抽象类,可以使用 abstract class 或者 abstract
abstract class "动物" as animal {
'定义属性和方法的区别是是否带()
生命
新城代谢(氧气, 水)
}
'使用note来添加注释
note left of animal : 还有其他特性用以区别植物和微生物
'这是第二种定义结构的方式,我比较喜欢前一种
abstract 鸟
鸟 : 羽毛
鸟 : 下蛋()
class 大雁 {
下蛋()
飞()
}
class 鸭子 {
下蛋()
嘎嘎叫()
}
'定义一个包
package 虚拟的 {
class 唐老鸭 {
说话()
}
'指定泛化关系
唐老鸭 --|> 鸭子
'指定实现关系
唐老鸭 ..|> 讲话
}
'定义一个接口
interface 飞翔 {
飞()
}
interface 讲话 {
说话()
}
'生命一个类
class 水
'指定依赖关系
animal ..> 水
'类也可以不声明直接使用
animal ..> 氧气
'对元素的说明,可以在每一边使用 "".
鸟 "1" *--> "2" 翅膀
鸟 --|> animal
class 雁群
大雁 --|> 鸟
大雁 ..|> 飞翔
'在关系之间使用标签来说明时, 使用 ":"后接 标签文字
大雁 "n" <.o "1" 雁群 : 聚合
鸭子 --|> 鸟
@enduml
由此可见使用PlantUML来绘制UML是非常简单的(规则不多就那么几条常用的),而且不用考虑排版的问题(要是有人说你的图排版真差也有人背锅了),也不用考虑版本管理的问题(纯文本形式,真是太赞了)。官网上对每种类图的使用介绍也很详细,最佳的学习方法就是边用边查,用上几次基本就熟练了,以后妈妈再也不用担心我向别人解释代码结构了。
本文来自网易实践者社区,经作者张志明 授权发布。