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.状态模式的更多相关文章

  1. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  2. JS设计模式——5.单体模式

    JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html   单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...

  3. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  4. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  5. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  6. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  7. js设计模式——7.备忘录模式

    js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...

  8. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  9. js设计模式——4.迭代器模式

    js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...

随机推荐

  1. SpringBoot使用Swagger2搭建强大的RESTful API 文档功能

    swagger用于定义API文档. Swagger2的使用 Maven Plugin添加Swagger2相关jar包 <!--swagger2 start--> <dependenc ...

  2. 网页head头部meta和link标签使用大全

    <!-- 声明文档使用的字符编码 --> <meta charset="utf-8"> <!-- 声明文档的兼容模式 --> <meta ...

  3. 实验吧关于隐写术的writeUp(二)

    0x01 Black Hole 1.下载文件后,发现打不开,放到kali中.用命令file 分析一下文件 root@trial:~/Documents# file blackhole.img blac ...

  4. Opengl ES Glew库 ----- By YDD的铁皮锅

    前一篇随笔我写了Opengl的窗口创建,这一篇随笔我要写OpenGL glew库的使用.首先需要引入头文件h,库文件Lib和动态链接库DLL, 百度搜索OpenGL glew库找到这个纯英文网站,尽量 ...

  5. 在VMware下创建windows2008虚拟机

    1.创建新的虚拟机 打开VMware软件,点击主页内创建新的虚拟机 2.进入新建虚拟机向导 点击典型,点击下一步 3.在下一步中单击稍后安装操作系统 点击下一步 4.选择操作系统类型 客户机操作系统选 ...

  6. camunda流程部署的一些简单操作

    act_re_deployment:(流程部署对象表)存放流程部署的显示名和部署时间 act_re_procdef:(流程定义表)存放流程定义的属性信息 act_ge_bytearray:(资源文件表 ...

  7. Mysql 主从同步(转载)

    第一步: 在master上创建用于同步的用户 GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.* TObackup@'192.16 ...

  8. 为什么javaBean要有get/set方法的设计

    可以应对将来的修改,比如有一个以长度计算的项目开发好了,过段时间客户说这个项目要在美国上市,有了javaBean只要把所有以厘米计算的单位都乘以2.54转化为正确单位交给客户 public class ...

  9. 12-python基础—python3中的reduce()

    在 Python3 中,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在 functools 模块里,需要通过引入 functools 模块来调用 reduce() 函数: from ...

  10. Maven的pom.xml文件结构之基本配置parent和继承结构

    1.Maven项目的继承 Maven项目之间不仅存在多模块的聚合关系,而且Maven项目之间还可以存在相互继承的关系. Maven项目之间的继承关系通过<parent>表示,在子Maven ...