• JavaScript 设计模式之状态模式


    状态模式

    假使我们有如下状态

    定义状态类

    1. // 比如有一种状态
    2. const State = function () {
    3. let __currentStatus = {}
    4. const status = {
    5. 'A': function () {
    6. console.log('状态A')
    7. },
    8. 'B': function () {
    9. console.log('状态B')
    10. },
    11. 'C': function () {
    12. console.log('状态C')
    13. }
    14. }
    15. const ActionStatus = {
    16. change: function () {
    17. let args = arguments
    18. __currentStatus = {}
    19. for (let key of args) {
    20. __currentStatus[key] = true
    21. }
    22. return this
    23. },
    24. goes: function () {
    25. console.log('执行了一次操作')
    26. for (let key in __currentStatus) {
    27. status[key] && status[key]()
    28. }
    29. return this
    30. }
    31. }
    32. return {
    33. change: ActionStatus.change,
    34. goes: ActionStatus.goes
    35. }
    36. }

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

    使用

    1. const test = new State()
    2. test.change('A', 'B').goes().goes().change('A', 'C').goes()
    3. /**
    4. 执行了一次操作
    5. 状态A
    6. 状态B
    7. 执行了一次操作
    8. 状态A
    9. 状态B
    10. 执行了一次操作
    11. 状态A
    12. 状态C
    13. */

    或者这样使用

    1. State().change('A', 'B').goes().goes().change('A').goes()
    2. /**
    3. 执行了一次操作
    4. 状态A
    5. 状态B
    6. 执行了一次操作
    7. 状态A
    8. 状态B
    9. 执行了一次操作
    10. 状态A
    11. */

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

    总结

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

  • 相关阅读:
    【代码随想录刷题】栈与队列总结
    httprunner3.x总结24 - hrun3常见的测试前置、测试后置处理
    前端框架 Nuxtjs Vue3 SEO解决方案 SSR
    css经典面试题(二)
    rasa 对话机器人--http rest api
    2022年SQL经典面试题总结(带解析)
    [免费专栏] Android安全之和平精英(FZ)APK逆向分析
    C语言 函数指针
    C# 调用Python
    基于Flask的招聘信息可视化系统
  • 原文地址:https://blog.csdn.net/u010279990/article/details/136238014