状态模式
·
Yin灏
/**
* 状态模式
* 当一个对象的内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对象。
*/
// 状态对象的实现
// 投票结果状态对象
var ResultState = function () {
// 判断结果保存在内部状态中
var States = {
// 每种状态作为一种独立方法保存
state0: function () {
// 处理结果 0
console.log("这是第一种情况");
},
state1: function () {
// 处理结果 1
console.log("这是第二种情况");
},
state2: function () {
// 处理结果 2
console.log("这是第三种情况");
},
state3: function () {
// 处理结果 3
console.log("这是第四种情况");
},
};
// 获取某一种状态并执行其对应的方法
function show(result) {
States["state" + result] && States["state" + result]();
}
return {
show,
};
};
// 测试用例
ResultState.show(3);
/**
* 超级玛丽
* 状态的优化
*/
// 创建超级玛丽状态类
var MarryState = function () {
// 内部状态私有变量
var _currentState = {},
// 动作与状态方法映射
states = {
jump: function () {
// 跳跃
console.log("jump");
},
move: function () {
// 移动
console.log("move");
},
shoot: function () {
// 射击
console.log("shoot");
},
squat: function () {
// 蹲下
console.log("squat");
},
};
// 动作控制类
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 () {
console.log("触发一次动作");
for (var i in _currentState) {
states[i] && states[i]();
}
return this;
},
};
return {
change: Action.changeState,
goes: Action.goes,
};
};
// 测试用例
MarryState()
.change("jump", "shoot") // 添加跳跃与设计动作
.goes() // 执行动作
.goes() // 执行动作
.change("shoot") // 添加射击动作
.goes(); // 执行动作
// 实例化超级玛丽类
var marry = new MarryState();
marry
.change("jump", "shoot") // 添加跳跃与设计动作
.goes() // 执行动作
.goes() // 执行动作
.change("shoot") // 添加射击动作
.goes(); // 执行动作