javascript 写状态模式
写了状态模式的切换,以及分支循环。but 怎么实现子状态嵌套呢?
/**
* by JackChen 2016-3-26 11.51.20
*
* 状态模式:
* 一个状态到另一个状态的变换。其实可以把程序中变换复杂的流程抽离出来。
* 譬如Level2中状态的变换比较复杂,完全可以又外部来处理状态的变换。
* 通过在状态对象中指定切换状态的条件判断。读取当前的运行情况决定。
* 而核心类只需管理自己需要进行什么具体操作即可,不用管外部切换
*/
/////////////////////////
//状态类
// 设计自己的状态名称,切换状态时根据名称查找
var StateItem = function(name){
this._name = name;
}
StateItem.prototype = {};
StateItem.prototype.construct = StateItem;
//更新自己坐标同时,同步到外部元素
Object.defineProperties(StateItem.prototype, {
Name: {
get: function() {
return this._name;
},
set: function(v) {
this._name = v;
}
}
});
//运行函数,相当于接口,用于运行当前状态的代码。获得下个状态的名称
StateItem.prototype.run = function() {
return ;
}; //////////////////////////////////
//状态管理类
var StateManager = function () {
this._group = {};
this._entrance = "";
};
StateManager.prototype = {};
StateManager.prototype.construct =StateManager; //以名字为索引建立状态表
StateManager.prototype.add = function(stateItem) {
if (!this._group[stateItem.Name]) {
this._group[stateItem.Name] = stateItem;
return true;
}
else {
return false;
};
}; //设置唯一入口
StateManager.prototype.setEntrance = function(stateItemName) {
this._entrance = stateItemName;
}; //总体运行,查找当前入口函数,得到运行后下个状态名称,再查找这个名称的函数
//一旦下个状态不可知,则结束运行
StateManager.prototype.run = function(begeinState) {
var nextState;
nextState = this._group[this._entrance];
while(nextState){
var nextName = nextState.run();
console.log(nextState.Name);
nextState = this._group[nextName];
}
}; /////////////////////////////////
//测试 //外部对流程的改变之处
var needTerminalRiskManager = true;
var needOnline = false; var manager = new StateManager(); //开始
var begin = new StateItem("begin");
begin.run = function () {
return "appSelection";
};
manager.add(begin);
manager.setEntrance("begin"); //应用选择
var appSelection = new StateItem("appSelection");
appSelection.run = function () {
return "appInit";
};
manager.add(appSelection); //应用初始化
var appInit = new StateItem("appInit");
appInit.run = function () {
return "ReadAppData";
};
manager.add(appInit); //读应用数据
//这里决定了下个状态的切换方式。
//同样可以变成是调用自己形成循环
var ReadAppData = new StateItem("ReadAppData");
ReadAppData.run = function () {
if (needTerminalRiskManager) {
return "TRiskManager";
}
else{
return "DataAuthentic";
};
};
manager.add(ReadAppData); //终端风险管理
var TRiskManager = new StateItem("TRiskManager");
TRiskManager.run = function () {
return "TAAnalysis";
};
manager.add(TRiskManager); //静态数据认证
var DataAuthentic = new StateItem("DataAuthentic");
DataAuthentic.run = function () {
return "ProcRestric";
};
manager.add(DataAuthentic); //处理限制
var ProcRestric = new StateItem("ProcRestric");
ProcRestric.run = function () {
return "CardHolderVerify";
};
manager.add(ProcRestric); //持卡人认证
var CardHolderVerify = new StateItem("CardHolderVerify");
CardHolderVerify.run = function () {
return "TAAnalysis";
};
manager.add(CardHolderVerify); //终端行为分析
var TAAnalysis = new StateItem("TAAnalysis");
TAAnalysis.run = function () {
return "CAC";
};
manager.add(TAAnalysis); //卡片行为分析
var CAC = new StateItem("CAC");
CAC.run = function () {
return "OnlineDecison";
};
manager.add(CAC); //联机判定
var OnlineDecison = new StateItem("OnlineDecison");
OnlineDecison.run = function () {
if (needOnline) {
return "OnlineProc";
}
else {
return "Completion";
};
};
manager.add(OnlineDecison); //交易结束
var Completion = new StateItem("Completion");
Completion.run = function () {
return "end";
};
manager.add(Completion); //发卡行在线认证
var OnlineProc = new StateItem("OnlineProc");
OnlineProc.run = function () {
return "ScriptProc";
};
manager.add(OnlineProc); //发卡行脚本
var ScriptProc = new StateItem("ScriptProc");
ScriptProc.run = function () {
return "Completion";
};
manager.add(ScriptProc); //结束
var end = new StateItem("end");
end.run = function () {
return;
};
manager.add(end); manager.setEntrance("begin"); manager.run();
javascript 写状态模式的更多相关文章
- JavaScript设计模式 - 状态模式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript设计模式——状态模式
状态和行为: 所谓对象的状态,通常指的就是对象实例的属性的值:而行为指的就是对象的功能,再具体点说,行为大多可以对应到方法上. 状态模式的功能就是分离状态的行为,通过维护状态的变化,来调用不同状态对应 ...
- javascript设计模式--状态模式(State)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【设计模式】Javascript设计模式——状态模式(行为型)
注:这个模式是非常聪明的,很有点数学中组合的意思,现在,来看下这个模式是怎么个思想. 问题提出:假如某个操作有三种可能,分别为1,2,3,还可能是组合,比如先执行1,再执行2或者先执行2再执行3或者1 ...
- javascript 写策略模式,商场收银打折优惠策略
[Decode error - output not utf-8] ----------------------------- 购物清单 方便面 : 100 x 50 = 5000 | 4000 菊花 ...
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 原型模式:游戏开发设计模式之原型模式 & unity3d ...
- 轻松掌握:JavaScript状态模式
状态模式 状态模式(State)允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类. 状态模式的使用场景也特别明确,有如下两点: 一个对象的行为取决于它的状态,并且它必须在运行 ...
- 再起航,我的学习笔记之JavaScript设计模式19(状态模式)
状态模式 概念介绍 状态模式(State):当一个对象的内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对象 示例演示 在我们写项目的过程中或多或少会遇到如下的多分支判断 function ...
- JavaScript状态模式及状态机模型
这是一篇,我自己都看不完的文章... 文章大体就两部分: 状态模式的介绍 状态机模型的函数库javascript-state-machine的用法和源码解析 场景及问题背景: 我们平时开发时本质上就是 ...
随机推荐
- 【三支火把】---一份程序看懂C程序printf()的几种常用用法
闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...
- chrome浏览器当表单自动填充时,怎么去除浏览器自动添加的默认样式。
参考blog来自 http://segmentfault.com/q/1010000000671971 chrome浏览器当表单自动填充时,怎么去除浏览器自动添加的默认样式. 一.发现该问题的原因-是 ...
- ASP.NET用HttpListener实现文件断点续传
本文转载:http://www.cnblogs.com/TianFang/archive/2007/01/03/610739.html 断点续传的原理很简单,就是在Http的请求和应答的报文头上和一般 ...
- mysql delete from
delete a from #ta a where exists (select 1 from #tb b where a.id=b.id)
- Lucene教程具体解释
(建立索引)] )中生成的索引文件的存放地址.详细步骤简单介绍例如以下: 1.创建Directory对象,索引目录 2.创建IndexSearch对象,建立查询(參数是Directory对象) 3.创 ...
- android访问asset目录下的资源
android提供了AssetManager来访问asset目录下的资源, 在activity中通过getAssets()获取AssetManager 常用的api如下: 1.列举路径下的资源Stri ...
- oracle db mos文章 翻译系列
http://blog.csdn.net/msdnchina/article/details/38377125
- 【转】如何高效利用GitHub——2013-08-28 22
http://www.yangzhiping.com/tech/github.html 正是Github,让社会化编程成为现实.本文尝试谈谈GitHub的文化.技巧与影响. Q1:GitHub是什么 ...
- Scala函数字面量
Scala中函数为头等公民,你不仅可以定义一个函数然后调用它,而且你可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量.下面的例子为一个简单的函数字面量(参考整数字面 ...
- R-大数据分析挖掘(5-R基础回顾)
(一)R函数 R是一种解析型语言,输入后可直接获取结果 函数(输入参数,参数) R的函数分为“高级”和“低级函数” • 高级函数可调用低级函数 • 高级函数称为泛型函数 • 函数名 <-‐ ...