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();