JavaScript design pattern-state pattern
1. State mode
1.1 Introduction to State Mode
一个对象有状态变化
每次状态变化都会触发一个逻辑
不能总是用 if...else 来控制
示例
1.2 State pattern class diagram
传统 UML 类图
简化后的 UML 类图
1.3 State mode demonstration
class State {
constrator(color) {
this.color = color
}
handle(context) {
console.log(`turn to ${
this.color} light`)
context.setState(this)
}
}
class Context {
constructor() {
this.state = null
}
getState() {
return this.state
}
setState() {
this.state = state
}
}
let context = new Context()
let green = new State('green')
let yellow = new State('yellow')
let red = new State('red')
green.handle(context)
console.log(context.getState())
yellow.handle(context)
console.log(context.getState())
red.handle(context)
console.log(context.getState())
1.4 State mode scene
1.4.1 Finite State Machine
·有限状态机 - 收藏/取消
var fsm = new StateMachine({
init: '收藏',
transitions: [
{
name: 'doStore',
from: '收藏',
to: '取消收藏'
},
{
name: 'deleteStore',
from: '取消收藏',
to: '收藏'
}
],
methods: {
onDoStore: function () {
alert('收藏成功')
updateText()
},
onDeleteStore: function () {
alert('已取消收藏')
updateText()
}
}
})
var $btn = $('#btn')
$btn.click(function () {
if (fsm.is('收藏')) {
fsm.doStore()
} else {
fsm.deleteStore()
}
})
function updateText() {
$btn.text(fsm.state)
}
updateText()
1.4.2 Write a simple Promise
function loadImg(src) {
const promise = new Promise(function (resolve, reject) {
var img = document.createElement('img')
img.onload = function () {
resolve(img)
}
img.onerror = function () {
reject()
}
img.src = src
})
return promise
}
var src = 'http://www.imooc.com/static/img/index/logo_new.png'
var result = loadImg(src)
result.then(function (img) {
console.log('success 1')
}, function () {
console.log('failed 1')
})
result.then(function (img) {
console.log('success 2')
}, function () {
console.log('failed 2')
})
- analysis:
Promise 就是一个有限状态机
Promise 三种状态: pending fulfilled rejected
pending -> fulfilled 或者 pending -> rejected
不能逆向变化
var fsm = new StateMachine({
init: 'pending',
transitions: [
{
name: 'resolve',
from: 'pending',
to: 'fullfilled'
},
{
name: 'reject',
from: 'pending',
to: 'rejected'
}
],
methods: {
onResolve: function (state, data) {
data.successList.forEach(fn => fn())
},
onReject: function (state, data) {
data.failList.forEach(fn => fn())
}
}
})
class MyPromise {
constructor(fn) {
this.successList = []
this.failList = []
fn(() => {
fsm.resolve(this)
}, () => {
fsm.reject(this)
})
}
then(successFn, failFn) {
this.successList.push(successFn)
this.failList.push(failFn)
}
}
function loadImg(src) {
const promise = new Promise(function (resolve, reject) {
let img = document.createElement('img')
img.onload = function () {
resolve(img)
}
img.onerror = function () [
reject()
}
img.src = src
})
return promise
}
let src = 'xxx'
let result = loadImg(src)
result.then(function () {
console.log('ok1')
}, function () {
console.log('fail1')
})
result.then(function () {
console.log('ok2')
}, function () {
console.log('fail2')
})
1.5 Verification of the Design Principles of State Mode
将状态对象和主题对象分离,状态的变化逻辑单独处理
符合开放封闭原则