Skip to content

Commit d646be5

Browse files
committed
添加详细的描述,重构代码
1 parent 9e079fe commit d646be5

2 files changed

Lines changed: 58 additions & 0 deletions

File tree

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

0 commit comments

Comments
 (0)