JavaScript 设计模式之状态模式

状态模式

假使我们有如下状态

定义状态类

javascript 复制代码
// 比如有一种状态
const State = function () {
  let __currentStatus = {}
  const status = {
    'A': function () {
      console.log('状态A')
    },
    'B': function () {
      console.log('状态B')
    },
    'C': function () {
      console.log('状态C')
    }
  }
  const ActionStatus = {
    change: function () {
      let args = arguments
      __currentStatus = {}
      for (let key of args) {
        __currentStatus[key] = true
      }
      return this
    },
    goes: function () {
      console.log('执行了一次操作')
      for (let key in __currentStatus) {
        status[key] && status[key]()
      }
      return this
    }
  }
  return {
    change: ActionStatus.change,
    goes: ActionStatus.goes
  }
}

状态A、B、C 是不同的状态,可能会有多种状态同时出现的情况,我们可以这样使用

使用

javascript 复制代码
const test = new State()
test.change('A', 'B').goes().goes().change('A', 'C').goes()
/**
执行了一次操作
状态A
状态B
执行了一次操作
状态A
状态B
执行了一次操作
状态A
状态C
*/

或者这样使用

javascript 复制代码
State().change('A', 'B').goes().goes().change('A').goes()

/**
执行了一次操作
状态A
状态B
执行了一次操作
状态A
状态B
执行了一次操作
状态A
*/

我们在商城订单状态较多的情况就可以使用这种模式,比如在待收货前的几种状态下都可以发起某些操作,就可以直接使用 change(x,x,x,x) 的形式去判断逻辑了,而不用再一个个的用 if 叠加判断了

总结

++状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次执行时遍历所有分支。在程序中到底产出哪种行为结果,决定于选择哪种状态,而选择何种状态又是在程序运行时决定的。当然状态模式最终的目的即是简化分支判断流程。++

相关推荐
冰暮流星7 分钟前
javascript如何实现删除数组里面的重复元素
开发语言·前端·javascript
蜜獾云36 分钟前
设计模式之命令模式:给其他模块下达命令
设计模式·命令模式
网络点点滴2 小时前
透传属性$attrs
前端·javascript·vue.js
Moment2 小时前
尤雨溪宣布 Vite+ 正式开源,前端工具链要大一统了
前端·javascript·面试
喵叔哟2 小时前
5. 【Blazor全栈开发实战指南】--Blazor组件基础
开发语言·javascript·ecmascript
ujainu3 小时前
Electron 实战:将用户输入保存到本地文件 —— 基于 `fs.writeFileSync` 与 IPC 的安全写入方案
javascript·安全·electron
进击的尘埃3 小时前
基于 LangChain.js 的前端 Agent 工作流编排:Tool 注册、思维链可视化与多步推理的实时 DAG 渲染
javascript
颜酱4 小时前
最小生成树(MST)核心原理 + Kruskal & Prim 算法
javascript·后端·算法
蜡台4 小时前
Node 版本管理器NVM 安装配置和使用
前端·javascript·vue.js·node·nvm
奶昔不会射手6 小时前
自定义vue3函数式弹窗
前端·javascript·css