zoukankan      html  css  js  c++  java
  • 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();
    

      

  • 相关阅读:
    linux 添加环境变量(php为例)
    composer install Your requirements could not be resolved to an installable set of packages
    pytesseract 验证码识别
    mac crontab时间断内随机时间执行定时任务
    Mac使用crontab来实现定时任务
    安居客滑动验证码识别
    jQuery图片点击预览遮罩层,再点击关闭效果
    linux系统必学-部分链接
    JavaScript概念总结:作用域、闭包、对象与原型链
    Web前端性能优化全攻略
  • 原文地址:https://www.cnblogs.com/Again/p/5324659.html
Copyright © 2011-2022 走看看