zoukankan      html  css  js  c++  java
  • UML作业第五次:分析系统,绘制状态图

    UML作业第五次:分析系统,绘制状态图

    作业题目:分析电梯控制系统和银行账户系统,分别画出状态图

    一、要求及步骤

    step1:学习PlantUML状态图绘制方法

    step2:以《电梯控制》系统、《银行账户》系统为例,分析系统中的状态。

    step3: 分析电梯运行、银行账户的状态转换;

    step4:用PlantUML 编写 《电梯控制》系统、《银行账户》系统 状态转换的脚本;

    step5:在线绘制UML图;

    一、活动图语法

    活动标签(activity label)以冒号开始,以分号结束,文本格式支持creole wiki语法。,活动默认安装它们定义的顺序就行连接。

    @startuml
    :Hello world;
    :This is on defined on
    several **lines**;
    @enduml
    

    开始/结束

    可以使用关键字startstop表示图示的开始和结束。

    @startuml
    start
    :Hello world;
    :This is on defined on
    several **lines**;
    stop
    @enduml
    

    也可以使用 end 关键字。

    @startuml
    start
    :Hello world;
    :This is on defined on
    several **lines**;
    end
    @enduml
    

    条件语句

    在图示中可以使用关键字ifthenelse设置分支测试。标注文字则放在括号中。

    @startuml
    
    start
    
    if (Graphviz installed?) then (yes)
      :process all
    diagrams;
    else (no)
      :process only
      __sequence__ and __activity__ diagrams;
    endif
    
    stop
    
    @enduml
    

    也可以使用关键字elseif设置多个分支测试。

    @startuml
    start
    if (condition A) then (yes)
      :Text 1;
    elseif (condition B) then (yes)
      :Text 2;
      stop
    elseif (condition C) then (yes)
      :Text 3;
    elseif (condition D) then (yes)
      :Text 4;
    else (nothing)
      :Text else;
    endif
    stop
    @enduml
    

    重复循环

    可以使用关键字repeatrepeatwhile进行重复循环。

    @startuml
    
    start
    
    repeat
      :read data;
      :generate diagrams;
    repeat while (more data?)
    
    stop
    
    @enduml
    
    while循环

    可以使用关键字whileend while进行while循环。

    @startuml
    
    start
    
    while (data available?)
      :read data;
      :generate diagrams;
    endwhile
    
    stop
    
    @enduml
    

    还可以在关键字endwhile后添加标注,还有一种方式是使用关键字is

    @startuml
    while (check filesize ?) is (not empty)
      :read file;
    endwhile (empty)
    :close file;
    @enduml
    

    并行处理

    可以使用关键字forkfork againend fork表示并行处理。

    @startuml
    
    start
    
    if (multiprocessor?) then (yes)
      fork
    	:Treatment 1;
      fork again
    	:Treatment 2;
      end fork
    else (monoproc)
      :Treatment 1;
      :Treatment 2;
    endif
    
    @enduml
    

    注释

    文本格式支持creole wiki语法。

    A note can be floating, using floating keyword.

    @startuml
    
    start
    :foo1;
    floating note left: This is a note
    :foo2;
    note right
      This note is on several
      //lines// and can
      contain <b>HTML</b>
      ====
      * Calling the method ""foo()"" is prohibited
    end note
    stop
    
    @enduml
    

     颜色

    可以为活动(activity)指定一种颜色。

    @startuml
    
    start
    :starting progress;
    #HotPink:reading configuration files
    These files should edited at this point!;
    #AAAAAA:ending of the process;
    
    @enduml
    

    箭头

    使用->标记,可以给箭头添加文字或者修改箭头颜色。

    同时,也可以选择点状 (dotted),条状(dashed),加粗或者是隐式箭头

    @startuml
    :foo1;
    -> You can put text on arrows;
    if (test) then
      -[#blue]->
      :foo2;
      -[#green,dashed]-> The text can
      also be on several lines
      and **very** long...;
      :foo3;
    else
      -[#black,dotted]->
      :foo4;
    endif
    -[#gray,bold]->
    :foo5;
    @enduml
    

    连接器(Connector)

    可以使用括号定义连接器。

    @startuml
    start
    :Some activity;
    (A)
    detach
    (A)
    :Other activity;
    @enduml
    

    组合(grouping)

    通过定义分区(partition),你可以把多个活动组合(group)在一起。

    @startuml
    start
    partition Initialization {
    	:read config file;
    	:init internal variable;
    }
    partition Running {
    	:wait for user interaction;
    	:print information;
    }
    
    stop
    @enduml
    

    泳道(Swimlanes)

    你可以使用管道符|来定义泳道。

    还可以改变泳道的颜色。

    @startuml
    |Swimlane1|
    start
    :foo1;
    |#AntiqueWhite|Swimlane2|
    :foo2;
    :foo3;
    |Swimlane1|
    :foo4;
    |Swimlane2|
    :foo5;
    stop
    @enduml
    

    分离(detach)

    可以使用关键字detach移除箭头。

    @startuml
     :start;
     fork
       :foo1;
       :foo2;
     fork again
       :foo3;
       detach
     endfork
     if (foo4) then
       :foo5;
       detach
     endif
     :foo6;
     detach
     :foo7;
     stop
    @enduml
    

    特殊领域语言(SDL)

    通过修改活动标签最后的分号分隔符(;),可以为活动设置不同的形状。

    • |
    • <
    • >
    • /
    • ]
    • }
    @startuml
    :Ready;
    :next(o)|
    :Receiving;
    split
     :nak(i)<
     :ack(o)>
    split again
     :ack(i)<
     :next(o)
     on several line|
     :i := i + 1]
     :ack(o)>
    split again
     :err(i)<
     :nak(o)>
    split again
     :foo/
    split again
     :i > 5}
    stop
    end split
    :finish;
    @enduml
    

    二、分析电梯控制系统、银行账户系统

    (1)电梯控制

    1.电梯存在四种基本状态,即:待载、上升、下降、楼间停;

    2.电梯无人承载时停在某一楼层,处于待载状态;

    3.当有人进入电梯,并且当前楼层比目标楼层低,电梯上升;

    4.当有人进入电梯,并且当前楼层比目标楼层高,电梯下降;

    5.当在某一层时电梯内所有人都离开电梯,电梯回到待载状态;

    6.如果电梯中存在人,则执行2或3步骤

    (2)银行账户

    1.银行账户存在三种状态,即:空额、有余额、负债;

    2.初建立的账户没有存款,处于空额状态;

    3.若在空额状态时向账户存款,则进入有余额状态;若在空额状态时从账户取款,进入负债状态;

    4.在有余额状态时向账户存款,余额增加,但还是处于有余额状态;

    5.从账户中取款,若取款额小于余额,处于有余额状态;等于余额,回到空额状态;大于余额,进入负债状态;

    6.负债时,取款则余额减少,仍处于负债状态;存款,当存款额小于负债额,还是负债;存款额等于负债额,回到空额状态;若存款额大于负债额,进入有余额状态。

    三、脚本

    电梯控制:

    @startuml [*] --> 待载

      待载 -up-> 上升 : 进入[目标楼层>当前楼层]/关门上行  

     上升 -down-> 楼间停 : [进人/出人]/停机开门
     待载 -down-> 下降 : 进入[目标楼层<当前楼层]/关门下行  

     下降 -up-> 楼间停 : [进人/出人]/停机开门

      楼间停 -up-> 上升:[目标楼层>当前楼层]/关门上行  

      楼间停 -down-> 下降:[目标楼层<当前楼层]/关门下行   

      楼间停 -left-> 待载:[无人]/关门

    @enduml

    银行账户:

    @startuml [*] --> 空额
    空额 -down-> 有余额 : 存款/余额=余额+存款额

    空额 -down-> 负债 : 取款[取款额<最大限额]/余额=余额-存款额

    有余额 --> 有余额 : 存款/余额=余额+存款额

    有余额 --> 有余额 : 取款[取款额<余额]/余额=余额-取款额

    有余额 -right-> 负债 : 取款[取款额>余额]/余额=余额-取款额

    有余额 -up-> 空额 : 取款[取款额=余额]/余额=余额-取款额

    负债 --> 负债 : 取款[取款额<最大限额]/余额=余额-存款额

    负债 --> 负债 : 存款[存款额<负债额]/余额=余额+存款额

    负债 -left-> 有余额 : 存款[存款额>负债额]/余额=余额+存款额

    负债 -up-> 空额 : 存款[存款额=负债额]/余额=余额+存款额

    空额 -up-> [*]

    @enduml

    四、UML图

    电梯控制:

    银行账户:

  • 相关阅读:
    【算法学习笔记】76.DFS 回溯检测 SJTU OJ 1229 mine
    【算法学习笔记】75. 动态规划 棋盘型 期望计算 1390 畅畅的牙签盒(改)
    【算法学习笔记】74. 枚举 状态压缩 填充方案 SJTU OJ 1391 畅畅的牙签袋(改)
    【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人
    【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
    【算法学习笔记】71.动态规划 双重条件 SJTU OJ 1124 我把助教团的平均智商拉低了
    【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
    【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks
    【算法学习笔记】68.枚举 SJTU OJ 1272 写数游戏
    【算法学习笔记】67.状态压缩 DP SJTU OJ 1383 畅畅的牙签袋
  • 原文地址:https://www.cnblogs.com/cuixihan/p/10816709.html
Copyright © 2011-2022 走看看