状态模式笔记
当一个对象的内部状态发生改变时,会导致行为的改变,这像是改变了对象
状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次执行时遍历所有分支
主要目的:将条件判断的不同结果转化为状态对象的内部状态,既然是状态对象的内部状态,所以作为状态对象内部的私有变量,然后提供一个能够调用状态对象内部状态的接口方法对象。
最终目的:简化分支判断流程
当有许多判断时,如果用if或者switch条件判断语句来写,是很难维护的,因为增加或删除一个条件需要改动的地方太多了
其次组合条件用if或switch分支判断实现,无形中增加的成本是无法想象的。
状态类
1 //状态类 2 var State = function(){ 3 var _currentState = {}, 4 states = { 5 one : function(){ 6 console.log("状态one"); 7 }, 8 two : function(){ 9 console.log("状态two"); 10 }, 11 three : function(){ 12 console.log("状态three"); 13 }, 14 four : function(){ 15 console.log("状态four"); 16 }, 17 five : function(){ 18 console.log("状态five"); 19 } 20 }; 21 //控制类 22 var Action = { 23 changeState : function(){ 24 //组合动作由多个参数实现 25 var arg = arguments; 26 //重置内部状态 27 _currentState = {}; 28 if(arg.length){ 29 for(var i=0, len = arg.length; i < len; i++){ 30 //从内部状态添加动作 31 _currentState[arg[i]] = true; 32 } 33 } 34 return this; 35 }, 36 goes : function(){ 37 //遍历内部状态保存的动作 38 for(var i in _currentState){ 39 //如果该动作就执行 40 states[i] && states[i](); 41 } 42 return this; 43 } 44 } 45 return { 46 change : Action.changeState, 47 goes : Action.goes 48 } 49 }
两种方式执行这个状态类
1. 函数方式
1 State().change('one','three').goes().goes().change('two').goes();
2. 实例化类
1 var state = new State(); 2 state.change('one','three').goes().goes().change('two').goes();
控制台显示