JS设计模式(状态模式)

JS设计模式(状态模式)

介绍

  • 一个对象有状态变化
  • 每次状态变化都会触发一个逻辑
  • 不能总用 if…else 来控制

演示

UML类图

传统UML类图

在这里插入图片描述

简化后的UML类图

在这里插入图片描述
示例:
交通信号灯不同颜色的变化

// 状态
class State {
    constructor(color) {
        this.color = color
    }
    // 设置
    handle(context) {
        console.log(`turn to ${this.color} hight`)
        context.setState(this)
    }
}
// 主体
class Context {
    constructor() {
        this.state = null
    }
    getState() {
        return this.state
    }
    setState(state) {
        this.state = state
    }
}
//测试
let context = new Context()
let red = new State('red')
red.handle(context)
console.log(context.getState())

场景

有限状态机

  • 有限个状态、以及在这些状态之间的变化
  • 如交通信号灯
  • 使用开源lib:javascript-state-machine
    有限状态机
    在这里插入图片描述
    “收藏” 和 “取消”
    在这里插入图片描述

写一个简单的Promise

Promise就是有限状态机

  • Promise的三种状态:pending fullfilled rejected
  • pending — fullfilled,pending — rejected
  • 不能逆向变化
import StateMachine from 'javascript-state-machine'

//初始化状态机模型
let fsm = new StateMachine({
    init: 'pending', //初始化状态
    transitions: [{
        name: 'resolve',
        from: 'pending',
        to: 'fullfilled'
    }, {
        name: 'reject',
        from: 'pending',
        to: 'rejected'
    }],
    methods: {
        // 成功的回调
        onResolve: function(state, data) {
            console.log(state, data)
            // state - 当前状态机实例;data - fsm.resolve(xxx) 传递的参数
            data.successList.forEach(fn => fn())
        },
        // 失败的回调
        onReject: function(state, data) {
            // state - 当前状态机实例;data - fsm.reject(xxx) 传递的参数
            data.fileList.forEach(fn => fn())
        }
    }
})

class MyPromise {
    constructor(fn) {
        this.successList = []
        this.failList = []

        fn(() => {
            // resolve 函数
            fsm.resolve(this)
        }, () => {
            // reject 函数
            fsm.reject(this)
        })
    }
    then(successFn, failFn) {
        this.successList.push(successFn)
        this.failList.push(failFn)
    }
}

//测试
function loadImg(src) {
    const promise = new MyPromise(function (resolve, reject) {
        let img = document.createElement('img')
        img.onload = function() {
            resolve(img)
        }
        img.onerror = function() {
            reject()
        }
        img.src = src
    })
    return promise
}
let src = 'http://125.77.202.90:6060/fileApi/Assets/test/0630d238-3015-4899-8d44-fec5e7d3f01b.jpg'
let result = loadImg(src)

result.then(function() {
    console.log('ok1')
}, function() {
    console.log('fail1')
})
result.then(function() {
    console.log('ok2')
}, function() {
    console.log('fail2')
})

总结

设计原则验证

  • 将状态对象和主题对象分离,状态的变化逻辑单独处理
  • 符合开放封闭原则
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值