|
| 1 | +状态模式主要可以用于这种场景 |
| 2 | +1 一个对象的行为取决于它的状态 |
| 3 | +2 一个操作中含有庞大的条件分支语句 |
| 4 | +<h3>回想下街头霸王的游戏</h3> |
| 5 | +隆有走动,攻击,防御,跌倒,跳跃等等多种状态,而这些状态之间既有联系又互相约束。<br /> |
| 6 | +比如跳跃的时候是不能攻击和防御的。跌倒的时候既不能攻击又不能防御,而走动的时候既可以攻击也可以跳跃。<br /> |
| 7 | +要完成这样一系列逻辑, 常理下if else是少不了的. 而且数量无法估计, 特别是增加一种新状态的时候, 可能要从代码的第10行一直改到900行. <br /> |
| 8 | +<pre> |
| 9 | +<code> |
| 10 | +if ( state === 'jump' ){ |
| 11 | + if ( currState === 'attack' || currState === 'defense' ){ |
| 12 | + return false; |
| 13 | + } |
| 14 | +}else if ( state === 'wait' ){ |
| 15 | + if ( currState === 'attack' || currState === 'defense' ){ |
| 16 | + return true; |
| 17 | + } |
| 18 | +} |
| 19 | +</code> |
| 20 | +</pre> |
| 21 | +为了消灭这些if else, 并且方便修改和维护, 我们引入一个状态类. |
| 22 | +<pre> |
| 23 | +<code> |
| 24 | +var StateManager = function(){ |
| 25 | + var currState = 'wait'; |
| 26 | + var states = { |
| 27 | + jump: function( state ){ |
| 28 | + }, |
| 29 | + wait: function( state ){ |
| 30 | + }, |
| 31 | + attack: function( state ){ |
| 32 | + }, |
| 33 | + crouch: function( state ){ |
| 34 | + }, |
| 35 | + defense: function( state ){ |
| 36 | + if ( currState === 'jump' ){ |
| 37 | + return false; //不成功,跳跃的时候不能防御 |
| 38 | + } |
| 39 | + //do something; //防御的真正逻辑代码, 为了防止状态类的代码过多, 应该把这些逻辑继续扔给真正的fight类来执行. |
| 40 | + currState = 'defense'; // 切换状态 |
| 41 | + } |
| 42 | + } |
| 43 | + var changeState = function( state ){ |
| 44 | + states[ state ] && states[ state ](); |
| 45 | + } |
| 46 | + return { |
| 47 | + changeState : changeState |
| 48 | + } |
| 49 | +} |
| 50 | +var stateManager = StateManager(); |
| 51 | +stateManager.changeState( 'defense' ); |
| 52 | +</code> |
| 53 | +</pre> |
0 commit comments