假使我们有如下状态
-
- // 比如有一种状态
- 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 是不同的状态,可能会有多种状态同时出现的情况,我们可以这样使用
- const test = new State()
- test.change('A', 'B').goes().goes().change('A', 'C').goes()
- /**
- 执行了一次操作
- 状态A
- 状态B
- 执行了一次操作
- 状态A
- 状态B
- 执行了一次操作
- 状态A
- 状态C
- */
或者这样使用
- State().change('A', 'B').goes().goes().change('A').goes()
-
- /**
- 执行了一次操作
- 状态A
- 状态B
- 执行了一次操作
- 状态A
- 状态B
- 执行了一次操作
- 状态A
- */
我们在商城订单状态较多的情况就可以使用这种模式,比如在待收货前的几种状态下都可以发起某些操作,就可以直接使用 change(x,x,x,x) 的形式去判断逻辑了,而不用再一个个的用 if 叠加判断了
状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次执行时遍历所有分支。在程序中到底产出哪种行为结果,决定于选择哪种状态,而选择何种状态又是在程序运行时决定的。当然状态模式最终的目的即是简化分支判断流程。