State模式的一些说道

这个模式我们组用的很多,基本不需要怎么讲解了,这里就随便举个例子说说

就举经典的地铁投币门吧。如果原来锁着,想通过就要想警报,而投币就会解锁;如果原来开着,那么投币就会向你道谢,通过后重新上锁。

如果设计程序来模仿这个门,那么很简单的使用if/else或者switch/case就可以搞定:
if(state==locked)
    if(event==coin)
        unlock()
        state=unlocked
    else if(event==pass)
        alert()
else if(state==unlocked)
    if(event==coin)
        thanks()
    else if(event==pass)
        lock()
        state=locked

这个实现的缺点我就不多说了,很难对未来的扩展做出好的响应,逻辑集中,容易出错。

不用这个,我们还可以把 状态/事件/动作/动作后的状态 写成一个状态迁移表
transitions = Array of transition
transitions.Add(locked, coin, unlock, unlocked)
transitions.Add(locked, pass, alert, locked)
transitions.Add(unlocked, coin, thanks, unlocked)
transitions.Add(unlocked, pass, lock, locked)

函数中调用
for(i=0; i<transitions.size(); i++)
{
    transition = transitions.at(i);
    if(state==transition.state && event==transition.event)
    {    
        transition.action.execute()
        state=transition.newstate
    }
}

这个其实不错,每次修改时,只要维护好迁移表就可以了,代价是速度,遍历表的速度,还有如果状态很多时,很烦人的维护工作。



            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值