首页 新闻 赞助 找找看

设计模式-状态模式

0
悬赏园豆:20 [已解决问题] 解决于 2017-11-23 16:17

最近在学设计模式,有些地方不懂请教下大家。比如状态模式,怎么在状态之间任意切换。像 普通 会员 超级会员 普通怎么能够跳跃切换。 还有一个疑问是 状态之间怎么取得或使用其他状态的数据。 

问题补充:

如果问的问题有问题麻烦告知

顾海以北的主页 顾海以北 | 初学一级 | 园豆:168
提问于:2017-11-22 16:46
< >
分享
最佳答案
1

就按你的例子

一个普通会员在使用了某音乐客户端一段时间后变成了穷逼会员,如果一段时间不续费的话又会重新跌会普通会员,不同会员在播放音乐的时候会自动使用不同音质的源。

那么按照一般的做法就是写几个if else搞定

if(account.State=Normal)

{

  if(account.PlayTimes>10){

    account.ChangeTo穷逼();

      music.PlayHighQuality();

  }

  else

    music.PlayLowQuality();

}

else if(account.State=穷逼)

{

  if(account.PlayTimes>100){

    music.PlayLowQuality();

    account.ChangeToNormal();

  }else

  music.PlayHighQuality();

}

else

  music.PlayHighQuality();

这种代码嘛,如果放现在我来看其实也能凑合,但如果逻辑复杂了后你可能会看到数不清的大括号,然后任何一次需求变更你就会相当纠结。

如果硬要用状态模式的话,这块就比较容易了,可以直接将这些判断拆到各自的派生类中,外边只需要一个

music.PlayFor(account.State);(这里突出State只是方便你往这个模式上套,实际使用上可能并不是这样)

收获园豆:20
Daniel Cai | 专家六级 |园豆:10424 | 2017-11-22 18:36

先谢过了

顾海以北 | 园豆:168 (初学一级) | 2017-11-22 19:00

多多指教

每个状态都有切换到其他的状态的方法  在舞台中根据条件切换  

pulic clsss NormalState 

{

    pulic override void PlayLowQuality()

    {  

        setState(Normal);

        播放低品质音乐;

    }

   pulic  override void PlayHigtQuality()

    {

         

     }

}

pulic clsss PoorState 

{

    pulic  override  void PlayLowQuality()

    {

       

    }

   pulic override void PlayHigtQuality()

    {

         setState(Normal);

         播放高品质音乐;

    }

}

 

pulic clsss content

{

   State  state =new State  ();

  pulic void  setState ();

    pulic void PlayLowQuality()

  {

    state.PlayLowQuality();

  }

    pulic void PlayHigtQuality()

   {

      state.PlayHigtQuality();

   }

}

pulic clsss  舞台

 {

     content con = new content ();

     con.setstate(poor)

    if(穷逼会员==con.state)

    {

          --根据条件 播放

    con. PlayHigtQuality()

      }

     

}

顾海以北 | 园豆:168 (初学一级) | 2017-11-22 20:02

感觉不用if判断是不行了  在假如 某个副本 有开始  战斗 结算 三个状态 结算状态怎么取得战斗状态的数据 (如杀怪数量) 可以用中介模式吗

 

顾海以北 | 园豆:168 (初学一级) | 2017-11-22 20:12

@顾海以北: if这种没什么啊,设计模式可不是为了消除if,如果目标是这个的话那就是设计过度了。

Daniel Cai | 园豆:10424 (专家六级) | 2017-11-23 09:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册