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. PHP copy() 函数

    定义和用法 copy() 函数复制文件. 该函数如果成功则返回 TRUE,如果失败则返回 FALSE. 语法 copy(file,to_file) 参数 描述 file 必需.规定要复制的文件. to ...

  2. WebView loadRequest请求错误"NSURLConnection finished with error - code -1022"

    执行下面代码 [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www ...

  3. VMware Hyper-V不兼容

    VMware Workstation Windows系統的Hyper-V不相容 禁用Device Guard或Credential Guard 1. 以管理員身份運行Windows Powershel ...

  4. (转)使用OpenGL显示图像(五)添加移动

    添加移动 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/motion.html 转:http://hukai. ...

  5. ios 最全的常用字符串操作

    1.将NSData / NSString转化 1 2 3 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; // 将字符串 ...

  6. bootstrap Grid布局(网格布局)

    基本网络结构 <div class="container"> <div class="row"> <div class=" ...

  7. Java面试必问-ThreadLocal

    前言 在面试环节中,考察"ThreadLocal"也是面试官的家常便饭,所以对它理解透彻,是非常有必要的. 有些面试官会开门见山的提问: “知道ThreadLocal吗?” “讲讲 ...

  8. 清除浮动最有效的css写法

    说起来呢,基本上只要你给容器div加了float的属性,就需要清除浮动来使页面显示正常,那么,到底有什么方法可以让浮动轻松清除呢? 可以用display:flex;替代,但是它对IE8,9支持不是很好 ...

  9. shell脚本命令行参数里的空白符

    看一个小脚本 #!/bin/bash #demonstarting the shift command count= while [ -n "$1" ] ; do echo &qu ...

  10. MNIST多图显示--Python练习

    在学习TensorFlow框架时,提到用MNIST手写数字数据库进行练习,为了更直观看下里面的数据到底长啥样,用OpenCV(cv2)中的imshow函数来进行显示. 默认已经安装: numpy.te ...