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

  

时间: 2024-10-12 22:19:34

javascript 写状态模式的相关文章

JavaScript设计模式 - 状态模式

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>状态模式</title> </head> <body> <input type="button" value="download" id="download_button&quo

深入理解JavaScript系列(43):设计模式之状态模式

介绍 状态模式(State)允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类. 正文 举个例子,就比如我们平时在下载东西,通常就会有好几个状态,比如准备状态(ReadyState).下载状态(DownloadingState).暂停状态(DownloadPausedState).下载完毕状态(DownloadedState).失败状态(DownloadFailedState),也就是说在每个状态都只可以做当前状态才可以做的事情,而不能做其它状态能做的事儿. 由于Stat

JavaScript中的设计模式:状态模式

前几天写了一个贪吃蛇小游戏,正好用到了状态模式. 定义 当一个对象内部状态发生改变时候,会导致其行为的改变,这看起来像是改变了对象. 简单的例子 如果一个函数要更具某一个对象的状态来判断该对象应该执行的方法,那么这个函数中会增加很多if判断分支,并且,如果要增加这个对象的一种状态,那么就要在原来的代码中添加一些判断,比较麻烦.例如,贪吃蛇有移动.吃食物.死亡等状态,如果我在处理这些状态的时候这么写代码(如下面) this.process = function(point){ if (this.i

javascript设计模式学习之十六——状态模式

状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模式中刚好相反,状态模式的关键是把事务的每种状态都封装为单独的类,跟此种状态有关的行为都封装在这个类的内部.与此同时,我们还可以把状态的切换规则实现分布在状态类中,这样就有效消除了原本存在的大量条件分支语句.

设计模式: 自己手动写一个状态模式

状态模式: 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式将状态封装成独立的类,并将动作委托到代表当前状态的对象.状态模式使用组合通过简单引用不同的状态对象来造成类改变的假象. 状态模式和策略模式有相同的类图,但它们的意图不同,策略模式会用行为和算法来配置Context类.状态模式允许Context随着状态的改变而改变其行为. 源代码: </pre><pre name="code" class="java">pac

JavaScript设计模式_13_状态模式

状态模式是一种根据事物内部状态的改变,从而改变事物行为的一种模式. /** * pre:状态模式 */ //---------- 示例1 ---------------- /** * 模拟电灯开关 */ var Light = function() { this.state = "off"; this.button = null; }; Light.prototype.init = function() { var button = document.createElement(&qu

状态模式全解析--JavaScript

1 初级电灯例子 , 状态仅仅用字符串表示,没有封装到对象 class Light{ constructor(){ this.state = 'off'; let button = document.createElement( 'button' ); button.innerHTML = '开关'; this.button = document.body.appendChild( button ); this.button.onclick = ()=>{ this.buttonWasPress

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

【设计模式】 模式PK:策略模式VS状态模式

1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式.但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的:而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的.这两种模式虽然都有变换的行为,但