# 状态模式举例

比如中午啦,终于下班了,这个时候你来到一家新开的餐馆吃饭,你可能会点米饭、水饺、面条。。。餐馆会根据你的订单给你做饭,下面我们来用代码模拟下这个事:

class Restaurant {
  constructor() {
    // 是否能做
    this.isCanDo = true
  }
  // 点餐
  makeOrder(state) {
    this.state = state
    if (!this.stateToProcessor[state]) return;

    this.stateToProcessor[state]();
  }
  stateToProcessor = {
    rice: () => {
      console.log(`米饭${this.isCanDo ? '能做' : '不能做'},开始做`)
    },
    noodles: () => {
      console.log(`面条${this.isCanDo ? '能做' : '不能做'},开始做`)
    },
    dumplings: () => {
      console.log(`水饺${this.isCanDo ? '能做' : '不能做'},开始做`)
    }
  }
}
const restaurant = new Restaurant();
restaurant.makeOrder('rice');

上面的代码书写格式是不是很熟悉,咋和策略模式那么相似呢?仔细看看好像和策略模式也不同,如果用策略模式 stateToProcessor 应该放到 Restaurant 类的外面,这里为什么放到里面了呢?这是因为餐馆给你做的前提是你点的这个餐餐馆能不能做,每个饭菜的制作都依赖于这个状态。

# 状态模式和策略模式的区别

策略模式和状态模式确实是相似的,它们都封装行为、都通过委托来实现行为分发。策略模式中的行为函数不依赖调用主体,彼此平行。状态模式中的行为函数和状态主体存在着关联,由状态主体把它们串在一起。

# 状态模式总结

状态模式

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。