前页 后页

激光唱机

CD Player应用程序的行为可能看起来很直观。但是,有许多规则与何时启用和禁用按钮,窗口的文本字段中显示的内容以及用户向应用程序提供事件时发生的情况有关。

假设我们的示例CD播放器具有以下功能:

  • 按钮-加载随机CD,播放,暂停,停止,上一曲目,下一曲目和弹出
  • 显示-轨道数,当前轨道,轨道长度和经过的时间

StateMachine CD播放器

使用两个属性定义了CDPlayer类: currentTracknumberOfTracks

Example simple Class diagram and Class element in Sparx Systems Enterprise Architect

StateMachine用于描述CD播放器的状态:

Example StateMachine diagram showing state change in Sparx Systems Enterprise Architect

  • 在较高级别上,StateMachine具有两个状态: CD未 加载CD已加载
  • CD加载可以由三个简单状态组成: CD停止CD播放CD暂停
  • 定义了用于事件加载,弹出,播放,暂停,停止,上一个和下一个事件的触发器的过渡
  • 定义状态行为和过渡效果以更改CDPlayer中定义的属性的值;例如,“ Previous”事件将触发自我转换(如果当前状态为CD PlayingCD Paused ),并且将执行效果,这将减小currentTrack的值或环绕到最后一个轨道
我们可以创建一个Executable StateMachine Artifact,并创建一个键入CDPlayer的属性,然后在Enterprise Architect模拟StateMachine以确保模型正确。

Visualization of a running executable statemachine in Enterprise Architect's simulation tool

检查生成的代码

Enterprise Architect将在用户指定的文件夹中生成这些文件:

  • 后端代码:CDPlayer.js,ContextManager.js,EventProxy.js
  • 客户端代码:ManagerWorker
  • 前端代码:statemachineGUI.js,index.html
  • 其他代码:SimulationManager.js

文件

描述

/CDPlayer.js

该文件定义了CDPlayer类及其属性和操作。它还使用状态行为和过渡效果定义类的StateMachines。

/ContextManager.js

该文件是上下文的抽象管理器。该文件定义了与实际上下文无关的内容,这些内容是在ContextManager的泛化中定义的,例如SimulationManagerManagerWorker

模拟(可执行状态机工件)可能涉及多个上下文;例如,在网球比赛模拟中,将有一个裁判员被键入为Class Umpire,并且有两名选手( playerAplayerB )被键入为Class Player。裁判员和类播放器都将定义自己的StateMachine。

/EventProxy.js

该文件定义了仿真中使用的事件和信号。

如果要使用参数引发事件,则将事件建模为信号事件,该事件指定信号类;然后,我们定义信号类别的属性。每个事件出现都有一个信号实例,其中包含为属性指定的运行时值。

/SimulationManager.js

该文件用于Enterprise Architect仿真。

/html/ManagerWorker.js

该文件用作前端和后端之间的中间层。

  • 前端发布一条消息以请求ManagerWorker的信息
  • 由于ManagerWorker从ContextManager进行概括,因此它具有对所有上下文的完全访问权限,例如查询当前活动状态和查询变量的运行时值。
  • ManagerWorker将使用从后端检索到的数据将消息发布到前端

/html/statemachineGUI.js

该文件通过定义stateMachineWorker来建立前端与ManagerWorker之间的通信。它:

  • 定义函数startStateMachineWebWorkerstopStateMachineWebWorker
  • 使用占位符代码定义函数onActiveStateResonseonRuntimeValueResponse
    //做:写用户的逻辑
您可以简单地用逻辑替换此注释,如本主题后面所述

/html/index.html

这定义了HTML用户界面,例如按钮和引发事件或显示信息的输入。您可以在此文件中定义CSS和JavaScript。

自定义index.html和statemachineGUI.js

对生成的文件进行以下更改:

  • 创建按钮和显示
  • 创建CSS样式以格式化显示并启用/禁用按钮图像
  • 创建一个ElapseTimeWorker.js以每秒刷新一次显示
  • 创建一个TimeElapsed函数,当经过的时间达到轨道的长度时,将其设置为Next Track
  • 创建JavaScript作为按钮“ onclick”事件处理程序
  • 广播事件后,请请求cdPlayer.currentTrack的活动状态和运行时值
  • 初始化时,请求激活状态

statemachineGUI.js中找到onActiveStateResonse_cdPlayer函数

  • 在CDPlayer_StateMachine_CDUnLoaded中,禁用所有按钮并启用btnLoad
  • 在CDPlayer_StateMachine_CDLoaded_CDStopped中,禁用所有按钮并启用btnEject和btnPlay
  • 在CDPlayer_StateMachine_CDLoaded_CDPlaying中,启用所有按钮并禁用btnLoad和btnPlay
  • 在CDPlayer_StateMachine_CDLoaded_CDPaused中,启用所有按钮并禁用btnLoad

statemachineGUI.js中找到函数onRuntimeValueResponse

  • cdPlayer.currentTrack中 ,我们更新当前轨道和轨道长度的显示

完整的例子

通过单击以下链接,可以从Sparx Systems网站的“资源”页面访问该示例:

CD播放器模拟

单击“加载随机CD”按钮,然后单击“启动模拟”按钮。