介绍
PlantUML是一个开源项目,支持快速绘制多种图形,可以用写代码的模式来“画”UML图
优势
1.可以用代码方式存储你的图表,这样可以用git方式去管控修改UML图。
2.用代码表达程序,自动画出对应UML图,更加更加高效。
环境
1.Java环境
2.graphviz-dot (brew install graphviz)
二、工具(列举两个)
1.VSCode PlantUML + PlantUML Previewer+Markdowm Preview Enhanced (免费)
2.Mweb(收费)
三、懒得不想配置环境
直接在服务器上生成(https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000)
类图
abstract 抽象
class 类
entity 实例
enum 枚举
interface 接口
箭头使用方式
Class01 ..> Class02 :依赖
Class03 --> Class04 :关联
Class05 <|-- Class06 :继承
Class07 ..|> Class08 :实现
Class09 --o Class10 :聚合
Class11 --* Class12 :组合
可以在类图上加上一些方法和变量修饰
class Dummy {
String data
void methods()
}
class Flight {
flightNumber : Integer
departureTime : Date
void methods()
}
interface callback{
void callback()
}
enum Source{
Android,HDMI1,HDMI2
}
abstract BaseActivity{
flag :Bool
}
整体使用
class McuServiceApplication {
- mMcuStub: IMcuDataHelper.Stub
+ onCreate():void
}
class McuHandler {
+ postMcuCommand(command McuCommonBase,callback IMcuDataCallback):void
+ addMCuDataNotifyListener(packageName String ,callback IMcuNotifyCallback):void
+ removeMcuNotifyDataListener(packageName String) void
+ sendMcuDataResponseSync(command McuCommonBase) :McuCommonResponse
}
class McuSendDataControl {
- mDisposable : CompositeDisposable
- mSendSubject: Subject<McuCommonBase>
+ starServer():void
+ stopServer():void
+ performSendCommandToMCU():void
}
class McuComebackDataDispatcher {
- mObservers : ArrayList<IObserverWrapper>
- appCallbackNotifyMap : HashMap<String, IMcuNotifyCallback>
+ addMCuDataNotifyListener(packageName String, callback IMcuNotifyCallback):void
+ removeMcuNotifyDataListener(key String):void
+ removeSendDataListener(mcuSyncObserverWrapper IObserverWrapper):void
+ dispatchMcuData(response McuCommonResponse):void
}
class McuApiManager {
- mMcuApiCallback: McuCallback
+ setMcuCallBack(callback McuCallback): void
+ send(type CommandType,mainId byte, subId byte,buffer byte[]): void
+ startServer(): void
+ native_init(): int
+ native_release(): int
+ native_send(cmdType byte,mainId byte,subId byte,buffer byte[]): int
}
McuServiceApplication-->McuHandler
McuHandler --> McuSendDataControl
McuHandler --> McuComebackDataDispatcher
McuSendDataControl-->McuApiManager
McuComebackDataDispatcher -->McuApiManager
时序图
actor Request
note over Request :角色
activate McuServiceApplication
note over McuServiceApplication :方框为事件和生命线控制焦点
activate McuHandler
activate McuCommbackDataDispatcher
activate McuSendDataControl
activate McuApiManager
Request -> McuServiceApplication: 创建连接
McuServiceApplication --> Request:返回binder
group 处理请求
Request -> McuServiceApplication :发送mcu请求
McuServiceApplication -> McuHandler :对请求进行处理
McuHandler -> McuCommbackDataDispatcher : 将请求加入回调队列之中
McuHandler -> McuSendDataControl : 发送mcu请求到请求队列中
McuSendDataControl ->McuApiManager :队列拿出数据发送底层
McuApiManager --> McuCommbackDataDispatcher :Mcu回复的数据
McuCommbackDataDispatcher --> McuHandler :回复数据
McuHandler --> Request :用户拿到数据
end
group 注册请求 [当应用注册了事件监听]
Request -> McuServiceApplication :发起事件的注册监听
McuServiceApplication -> McuHandler : 对监听请求进行处理
McuHandler -> McuCommbackDataDispatcher :加入事件监听队列
McuApiManager --> McuCommbackDataDispatcher: mcu回复数据
McuCommbackDataDispatcher --> Request : 回调用户的callback
end
activate 市民
activate 终端服务系统
市民->终端服务系统 :办理老年卡
终端服务系统-->市民
alt 65>age>60
市民 -> 终端服务系统: 刷胜身份证办理
终端服务系统->市民:返回办理蓝卡成功
else age>65
市民 -> 终端服务系统: 刷胜身份证办理
终端服务系统->市民:返回办理蓝卡成功
else age<60
市民 -> 终端服务系统: 刷胜身份证办理
终端服务系统->市民:返回报错界面
end
时序图加上组合的使用
activate 市民
activate 终端服务系统
市民->终端服务系统 :办理老年卡
终端服务系统-->市民
alt 65>age>60
市民 -> 终端服务系统: 刷胜身份证办理
终端服务系统->市民:返回办理蓝卡成功
else age>65
市民 -> 终端服务系统: 刷胜身份证办理
终端服务系统->市民:返回办理蓝卡成功
else age<60
市民 -> 终端服务系统: 刷胜身份证办理
终端服务系统->市民:返回报错界面
end
activate 市民
activate 终端服务系统
市民->终端服务系统 :办理老年卡
终端服务系统-->市民
opt 没有注册老人卡
市民 -> 终端服务系统: 注册老人卡
终端服务系统->市民:返回办理老人卡成功
end
activate 市民
activate 终端服务系统
市民->终端服务系统 :选择购买的饮料
终端服务系统-->市民: 返回应该投币的金额 money
loop 投入的钱数<应该投币的数量
市民 -> 终端服务系统: 继续投入硬币币
终端服务系统->市民:返回投币的金额
end
活动图
start
:ClickServlet.handleRequest();
:new page;
if (Page.onSecurityCheck) then (true)
:Page.onInit();
if (isForward?) then (no)
:Process controls;
if (continue processing?) then (no)
stop
endif
if (isPost?) then (yes)
:Page.onPost();
else (no)
:Page.onGet();
endif
:Page.onRender();
endif
endif
stop
1.start 代表黑点开始节点
2.stop 代表结束节点
3.动作以 ‘:’开始 以’;’结束
4.决策用if()then else{}
@startuml
|老师|
start
:出题;
|#AntiqueWhite|学生|
:答题;
:交卷;
|老师|
:批改;
:发布成绩;
|学生|
:拿到成绩;
stop
@enduml
@startuml
start
repeat :foo作为开始标注;
:读取数据;
:生成图片;
backward:这是一个行为;
repeat while (更多数据?)
stop
@enduml
相关链接
PlantUml官网:https://plantuml.com/zh/
用在哪里合适使用
1.项目的ReadMe
-让接手的人能更快
-让自己能更了解自己的项目结构
2.KB文档中推荐使用
-编辑时候在’插入其他宏’中 找到 PlantUML Macro,将代码粘贴进去就会自动生成速度更快,排版也比较好看