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

  

 

posted @ 2016-03-27 00:44  $JackChen  阅读(380)  评论(0编辑  收藏  举报