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