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 ...
随机推荐
- UVa 548 Tree (建树+前序后序)
Description You are to determine the value of the leaf node in a given binary tree that is the termi ...
- 【dart学习】-- Dart之async和await
一,概述 在Dart1.9中加入了async和await关键字,有了这两个关键字,我们可以更简洁的编写异步代码,而不需要调用Future相关的API.他们允许你像写同步代码一样写异步代码和不需要使用F ...
- Mysql学习-安装与启动
安装mysqlrpm -ivh Mysql-server....rpm安装完成后,会提示/usr/bin/mysqladmin -u root password 'new-password'也可以用m ...
- [CSP-S模拟测试58]题解
以后题解还是单独放吧. A.Divisors 根号筛求所有数的因子,扫一遍去重统计即可. #include<cstdio> #include<iostream> #includ ...
- [NOIP模拟测试38]题解
来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...
- gokit 统计分析 M2M接入服务 OTA固件升级 硬件社交化
统计分析 M2M接入服务 OTA固件升级 硬件社交化 统计分析 为智能硬件定制的统计分析服务.只需添加入一行代码的集成工作,多维度的设备使用和用户行为数据就能自动统计出来. 演示 特色一:设备上线情 ...
- layui.form小例子
layui.form小例子 需要引入layui的包 <!doctype html> <html> <head> <meta charset="utf ...
- Hexo next博客的pjax一个Bug引发的关于pjax用法的小技巧-----pjax后图片点击放大的js失效
文章目录 广告: 背景 发现 解决 get技能 广告: 本人博客地址:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.git ...
- [轉]sendpage漏洞分析 CVE-2009-2692
之前看了<新爆内核高危漏洞sock_sendpage的利用分析的讨论 >这篇帖子,在九贱兄和诸位CUer的指引下,大致弄清了整个漏洞的始末.现与大家分享(引用自我的空间 ).有什么不足之处 ...
- 第二十五天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(四)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zwszws/article/details/28493209 6月4日.晴天. ...