| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,5 @@ | |||
| 1 | + <h3>设计模式</h3> | ||
| 2 | + 《parctical common lisp》的作者曾说,如果你需要一种模式,那一定是哪里出了问题。他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案。<br /> | ||
| 3 | + 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言、每种语言都有天生的优缺点。一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些。<br /> | ||
| 4 | + 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬。<br /> | ||
| 5 | + 换到程序中, 静态语言里可能需要花很多功夫来实现装饰者,而js由于能随时往对象上面扔方法,以至于装饰者模式在js里成了鸡肋 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,53 @@ | |||
| 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> | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments