灏天阁

状态模式

· 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(); // 执行动作

- Book Lists -