预订演示
前页 后页

激光唱机

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

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

  • 按钮 - 加载随机 CD、播放、暂停、停止、上一曲目、下一曲目和弹出
  • 显示 - 曲目数、当前曲目、曲目长度和已播放时间

CD播放器状态机

A类CDPlayer定义了两个属性: currentTracknumberOfTracks

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

状态机用于描述 CD 播放器A状态:

Example StateMachine diagram showing state change in Sparx Systems Enterprise Architect

  • 在更高的层次上,状态机有两种状态: CD UnLoadedCD Loaded
  • CD Loaded可以由三个简单状态组成: CD StoppedCD PlayingCD Paused
  • 转换定义为事件 Load、Eject、Play、Pause、Stop、Previous 和 Next 的触发器
  • 定义状态behaviors和效果状态定义的属性;例如,'Previous' 事件将触发自转换(如果当前状态是CD PlayingCD Paused )并执行影响,这将减少currentTrack的值或换行到最后一个轨道
我们可以创建一个状态状态机的属性,然后在Enterprise Architect可执行状态机中模拟该工件的类型,以确保该模型是正确的。

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 及其属性和操作。它还用状态行为和过渡效果定义了类的状态机。

/ContextManager.js

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

模拟(可执行状态机)可以涉及多个工件;例如,在网球比赛模拟中,将有一个裁判输入类Umpire,两个玩家——playerAplayerB——输入类类和ClassPlayer类定义自己的状态机

/EventProxy.js

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

如果我们用参数引发一个事件,我们模型事件为一个信号事件,它指定一个信号类;然后我们为信号类定义属性。每个事件发生都有一个信号实例,带有为属性指定的运行信号。

/SimulationManager.js

该文件用于Enterprise Architect中的模拟。

/html/ManagerWorker.js

该文件充当前端和后端之间的中间层。

  • 前端发消息向ManagerWorker请求信息
  • 由于ManagerWorker是从ContextManager泛化而来的,所以它可以完全访问所有上下文,例如查询当前活动状态和查询变量的运行时值
  • ManagerWorker 将向前端发送一条消息,其中包含从后端检索到的数据

/html/statemachineGUI.js

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

  • 定义函数startStateMachineWebWorkerstopStateMachineWebWorker
  • 使用占位符代码定义函数onActiveStateResponseonRuntimeValueResponse
    //to do: 写用户的逻辑
您可以简单地用您的逻辑替换此评论,本主题稍后将演示

/html/index.html

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

自定义 index.html 和 statemachineGUI.js

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

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

在 statemachineGUI.js 中找到函数onActiveStateResponse_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 按钮,然后单击开始仿真按钮。