在UML中,行为状态机和协议状态机均用于描述状态变化,但关注点和使用场景不同。以下是它们的区别及示例说明:
1. 核心区别
特征 | 行为状态机 | 协议状态机 |
---|---|---|
目的 | 描述对象内部行为及状态转换时的具体动作。 | 定义接口或协议的规则,约束操作的合法调用顺序。 |
关注点 | 状态转换的触发条件、动作执行、活动细节。 | 状态间的合法操作、前置/后置条件、协议约束。 |
动作与细节 | 包含进入/退出动作、转换触发的具体行为。 | 不涉及具体实现,仅规定允许或禁止的操作。 |
使用场景 | 对象行为的具体实现(如业务流程、算法)。 | 接口规范、协议设计(如API约束、通信协议)。 |
2. 示例对比
示例1:电梯控制系统
-
行为状态机
描述电梯的具体行为:-
状态:
停止
、移动
、开门
。 -
转换:
-
事件:
按下楼层按钮
→ 状态从停止
转至移动
,执行动作“启动电机”。 -
事件:
到达目标楼层
→ 状态转至开门
,执行动作“播放提示音”。
-
-
细节:明确状态转换时的具体动作(如启动电机、播放声音)。
-
-
协议状态机
定义电梯操作的协议规则:-
状态:
空闲
、运行中
、维护模式
。 -
约束:
-
在
维护模式
下,按下楼层按钮
操作被禁止。 -
在
运行中
状态下,紧急停止
操作始终允许。
-
-
细节:不描述如何执行操作,仅规定操作是否合法。
-
示例2:文件系统接口
-
行为状态机
描述文件对象的行为流程:-
状态:
关闭
、打开
、已修改
。 -
转换:
-
事件:
open()
→ 状态转至打开
,执行动作“加载文件内容”。 -
事件:
save()
→ 状态保持打开
,执行动作“写入磁盘”。
-
-
-
协议状态机
定义文件操作的调用规则:-
状态:
关闭
、打开(只读)
、打开(读写)
。 -
约束:
-
在
打开(只读)
状态下,write()
操作被禁止。 -
在
关闭
状态下,read()
操作必须前置open()
。
-
-
3. 关键差异总结
-
行为状态机:
-
聚焦如何做(How),如执行动作、处理事件。
-
示例:订单处理(“已支付”状态执行扣款逻辑)。
-
-
协议状态机:
-
聚焦允许做什么(What),如操作合法性、协议顺序。
-
示例:TCP连接(“已建立”状态允许
send()
但禁止重复SYN
)。
-
4. 建模元素对比
-
行为状态机:
-
包含状态(State)、转换(Transition)、动作(Action)、守卫条件(Guard)。
-
支持
entry/exit
动作和doActivity
。
-
-
协议状态机:
-
包含协议状态(Protocol State)、协议转换(Protocol Transition)。
-
使用前置条件(Precondition)和后置条件(Postcondition)约束操作。
-
通过以上对比和示例可以看出,行为状态机用于实现具体逻辑,而协议状态机用于定义规则,两者相辅相成,分别从不同角度描述系统行为。