js设计模式——5.状态模式
js设计模式——5.状态模式


代码演示
/*js设计模式——状态模式*/ // 状态(红灯,黄灯,绿灯)
class State {
constructor(color) {
this.color = color;
} handle(context) {
console.log(`turn to ${this.color} light`);
context.seState(this);
}
} // 主体
class Context {
constructor() {
this.state = null;
} getState() {
return this.state;
} seState(state) {
this.state = state;
}
} // test
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()) // 红灯亮了
red.handle(context)
console.log(context.getState()) // 黄灯亮了
yellow.handle(context)
console.log(context.getState())


引入javascript-state-machine示例
/*有限状态机*/
import StateMachine from 'javascript-state-machine'
import $ from 'jquery' let fsm = new StateMachine({
init: '收藏', // 初始化状态,带收藏
transitions : [
{
name : 'doState',
form : '收藏',
to : '取消收藏'
},
{
name : 'deleteState',
form : '取消收藏',
to : '收藏'
}
],
methods : {
// 执行收藏
onDoState : function () {
alert('收藏成功')
updateText()
}, // 取消收藏
onDeleteState: function () {
alert('已取消收藏')
updateText()
}
}
}) let $btn = $('btn1') $btn.click(function () {
if(fsm.is('收藏')){
fsm.doState()
} else {
fsm.deleteState()
}
}) // 更新方案
function updateText() {
$btn.text(fsm.state)
}
// 初始化方案
updateText()
以promise示例来演示
// promise 状态机模型
import StateMachine from 'javascript-state-machine'; let prmiseFsm = new StateMachine({
init: 'pending', // 初始化状态
transitions: [
{
name: 'resolve',
from: 'pending',
to: 'fullfilled',
},
{
name: 'reject',
from: 'pending',
to: 'rejected',
},
],
methods: {
// 监听 resolve
onResolve: function (state, data) {
// state —— 当前状态机示例 data - fsm.resolve(xxx) 传递的参数
data.succesList.forEach(fn => fn())
}, // 监听 reject
onReject: function (state, data) {
// state —— 当前状态机示例 data - fsm.reject(xxx) 传递的参数
data.failList.forEach(fn => fn())
}, },
}); // 定义 Promise
class MyPromise {
constructor(fn) {
this.succesList = []
this.failList = [] fn(function () {
// resolve 函数
fsm.resolve(this)
}, function () {
// reject 函数
fsm.reject(this)
});
} then(succesFn, failFn) {
this.succesList.push(succesFn)
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 = 'http://img2.imgtn.bdimg.com/it/u=234634259,4236876085&fm=26&gp=0.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');
});
js设计模式——5.状态模式的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- JS设计模式——5.单体模式
JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- js设计模式——7.备忘录模式
js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- js设计模式——4.迭代器模式
js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...
随机推荐
- php经典趣味算法
1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...
- jq动画效果慢慢滚动到固定位置
function contentTop(top){ $('body,html').animate({ scrollTop: top }, 500 ); } 获取元素top传入即可 contentTop ...
- STemWin5.22移植笔记(flyheart)
看了野火ISO开发板移植的emWin,感觉不错,但是没有写移植教程,通过摸索与百度知道了移植的过程!下面和大家分享一下 emWin是segger公司出的一款图形化界面,非常好看,大家所熟悉的ucGUI ...
- HTML5: HTML5 Web Workers
ylbtech-HTML5: HTML5 Web Workers 1.返回顶部 1. HTML5 Web Workers web worker 是运行在后台的 JavaScript,不会影响页面的性能 ...
- memcached 安装与简单实用使用
一.简介 1.memcache与memcached的区别与联系: memcache是php的拓展,memcached是客户端,复杂的说:Memcache模块提供了于memcached方便的面向过程及面 ...
- 【lua学习笔记】——在sublime中配置Lua运行环境
一.让Sublime可以运行lua脚本 打开sublime 选择tools-->Build System-->New Build System 在新出现的文件中输入如下内容: { &q ...
- Myeclipse中dtd代码提示
1.Myeclipse -->窗口 --> 首选项 2.输入xml c,然后添加 3.输入键 例如:http://struts.apache.org/dtds/struts-2.3.dtd ...
- python基础【第六篇】
list列表 基本结构 lst =[1,2,3,5,6] 为什么学列表? 列表能够存储比字符串更多的数据 列表能够存储各种数据类型 列表的注意点 列表是有序的 列表是可变的,支持索引,切片,步 切片后 ...
- 四、hibernate的缓存
缓存: 就是将数据保存到内存中,需要使用时直接从内存中获取,不需要每次查询数据库或者磁盘中的文件 hibernate的缓存 一级缓存:Session级别的缓存 二级缓存:SessionFactory级 ...
- Linux入门命令
####常用的目录 /主目录 ① /root:存放启动Linux时启动的核心文件,包括一些连接文件以及镜像 ② /bin:binary的缩写,存放经常使用的命令 ③ /dev:Device(设备)的缩 ...