PlantUML


介绍

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,将代码粘贴进去就会自动生成速度更快,排版也比较好看


  TOC