1、工作流状态机中状态模式的应用第 15 卷.第 1.2 期2005 年 l2 月微机发展Micro)nlpulerIkvelolmlelllVo1.15N【1.12I)ec.2005工作流状态机中状态模式的应用王亚俊,葛玮,郝克刚(西北大学计算机科学系软件工程研究所,陕西西安 710069)摘要:为设计一个方便且可扩展性强的工作流引擎, 将设计模式的思想运用了到工作流状态机中.介绍了状态模式的基本概念,阐述了状态与流程之间的关系,探讨了其在工作流状态机中的应用,最后给出了一个工作流状态机实现的具体例子,为工作流系统中运行服务模块的设计提供了解决思路.关键词:状态模式;工作流;状态机中国分类号:T
2、P311.5 文献标识码:A 文章编号:10053751(20o5)120O48 02ApplicationofStatePatterninWorkflowStateMachineWANGYajan.GEWei.HAOKe-gang(SoftwareEng.1nst.,Dept.0fComputerSci.NorthwestUnlv.Xian710069.China)Abstract:Combinesdesignpatternwithworkflowstatemachineinordertodesignaconvenientandstrongexpendingworkflowenac 仃 Tl
3、emservice.Thehesieconceptionofthestatepatternisintroducedinthispaper,explaintherehtionshipbetweenstateandprocedure,anddis?cusstheapplicationofstatepatteaninthestatemachineofworkflow.andalsogiveaconcreteexampleatlast.Itpmdesdesigningsoh?fioaforeflactmeta.tserviceofworkflowsysmm.words:statepattern;wor
4、ldlow;statemachinel 状态模式介绍11 定义状态模式(StatePatten),又称状态对象模式 (PattenofObj=tsforStates).状态模式是对象行为模式.状态模式允许一个对象在其内部状态改变的时候改变其行为1.一句话概括:状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的子类.状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变.状态模式的框架见图 1.图 l 状态模式框架收稿日期:20o5 一 O3 一 O3作者简介:王亚俊(198o_-), 男,陕西宝鸡人,硕士研究生 ,主要研究方向为软件工程,工作流
5、,移动代理技术.1.2 应用场景(1)一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变.(2)对象在某个方法里依赖于一重或多重的条件转移语句.其中有大量的代码.状态模式把条件转移语句的每一个分支都包装到一个单独的类里.这里使得这些条件转移分支能够以类的方式独立存在和演化.维护这些独立的类也就不再影响到系统的其他部分【2J.状态模式在工作流或游戏等各种系统中有大量使用.甚至是这些系统的核心功能设计,例如政府 OA 中.一个批文的状态有多种:未办.正在办理.正在批示,正在审核 .已经完成等各种状态.使用状态机可以封装这个状态的变化规则,从而达到扩充状态时,不必涉及到状态的使用
6、者.2 状态模式的设计状态模式实质:使用状态模式前.客户端外界需要介入改变状态.而状态改变的实现是琐碎或复杂的;使用状态模式后,客户端外界可以直接使用事件 Event 实现.根本不必关心该事件导致如何状态转换,这些是由状态机等内部实现【3J.好的状态模式必须做到两点:a.状态转换必须从外界其它逻辑划分出来.b.状态必须可方便拓展.对其它代码影响非常小.第 l2 期王亚俊等:工作流状态机中状态模式的应用?49?要做到这两点,必须先明确状态转换机制,状态转换实际是由 Event 事件驱动的 ,可以认为是 EventconditionState,在 MVC 模式一般是 EventconditionA
7、ction 实现.状态模式需要封装的是 EventconditionState 中的conditionState 部分 J.状态转换行为有两种划分标准:(1)在每个状态实现 next(),指定下一状态,next()中实现了在 Event 参与下几种可能转向的下一状态.(2)在 stateEnter 和 stateExit 时,即状态进入和状态退出时实现状态的转换.这两种方式各有优缺点:第一种是让 State 子类自行决定它的下一个继任者是谁,以及在什么时候进行转换,每个状态形成一个子类,每个状态只关心它的下一个可能状态,从而无形中形成了状态转换的规则,如果新的状态加入,只涉及它的前一个状态修改
8、和定义.而如果当转换条件是固定的,那么就可以由外界(context)来决定状态的转换,也就是第二种方式,在状态进入和状态退出时实现状态的转换.3 工作流状态机中状态模式的应用状态和流程的关系也非常重要,因为状态不是孤立的,可以说和流程是点和线的关系,状态从一个方面说明了流程,流程是随时间而改变,状态是截取流程某个时间片.因此,使用状态模式实现状态机实际是为了更好地表达和说明流程.状态和流程以及事件的关系见图 2.currentstatcnewS 忸 teI图 2 状态和流程以及事件的关系图图 2 表示了是事件改变了流程的状态,在业务逻辑中,经常发生的是事件,如果不使用状态模式,需要在很多业务逻
9、辑处实现事件到状态判定和转换,这不仅使程序逻辑复杂,而且也存在着一定的风险.图 3 过程实例的状态转移图工作流系统的整个流程实例的执行过程可以被看作是一个状态转换过程,其间流程实例因特定的命令,事件或某些条件的满足而由工作流引擎来控制状态的转换.工作流运行服务则可以被看作是一个状态转换机来实现.工作流过程实例依照图 3 的状态机进行状态转移,下面是工作流状态机,参见文献5.状态变化都离不开一个主体对象,主体对象可以说包含状态变化(行为) 和状态属性(属性), 这里这个主体对象就是过程实例,设为 Stat.)wner.下面是一个 Suspended 状态和状态机的代码示意:/State 接口pu
10、blicinterfaceStatepublicStatenext(Evente);/具体的子状态,此处是 running 子状态publicdassSuspendedimplementsStatepublicvoidsuspend(StateOwnerstateOwner)stateOwner.setCurrentState(this);l转换到下一个状态的规则:当前是 Suspended 状态,下一个状态可能是 Initiated,Running,Terminated 状态, 但是绝对不会是 Complete,Ac.tive 这样的状态.*/车 e 换规则在这里得到了体现publicSta
11、tenext(Evente)StatenextState=null;if(transitions=nul1)addEventState(newEventlmp(“Restart“).newInitiated();addEventState(newEventlmp(“Resume“),newRunning();addEventState(newEventlmp(“Temfinate“),DewTemainated();nextState=null;elsenextState=fireState(e);/根据不同的事件类型找相应的状态returnnextState;外界直接调用 StateMach
12、ine 的关键方法 transition;实行状态的自动转变.publicclassStateMachine/*状态切换*根据 Event 参数 ,运行相应的状态*1.获得当前状态*2.使用当前状态的 next()转换*lEvent*currentStateI.newState 一*/pubicfinalvoidtransition(Stringtaskid,Evente)throwsException(下转第 52 页)?52?微饥发展第 l5 卷StringpSuperMenultem)StringstrQuery=“select*fromtenl 一“pUserID+“Wherefath
13、erid=“+pSuperMenultem+“orderbyFllenlAorderasc“:ResultSetretumRs=null:trythis.st=eonn.createStatement(ResultSet.TYPESCROLLSENSITIVE.ResultSet.CONCURUPDATABLE);resultRs=this.St.executeQuery(strtmry):eat(SQLExceptione).System.OUt.println(e.toString();returnreturnRs;用户功能菜单生成效果如图 4 所示.鬻承政营理霉z 绕计分析 z空间查询f
14、I年审表首理取水井添加-;用水簿报管理.用水季报管理;文挡首理;i 用户首理 i?;退出系统年报年掘年掭图 4 用户功能菜单生成效果针对省内某地区的水资源管理系统,在 Windows2000+SQLServer2000 下,使用 JBuilderXEnterpriseWe.bLogicEdition+DreamweaverMX,运用 jsp/javabean 技术进行了实现.4 用户权限管理的操作步骤对于用户权限的管理主要涉及如下操作:步骤 1:添加用户.系统管理员根据需要创建可使用系统的用户.步骤 2:添加角色.系统管理员根据单位的管理需要为系统添加不同角色.步骤 3:为用户指派角色.一个用
15、户可以用多个角色,一个角色可以赋予多个用户.步骤 4:为角色分配权限.设置允许该角色使用的系统功能即角色可以使用的菜单项.5 结束语对用户的访问权限的控制是 B/S 结构电子政务系统开发和应用中一个重要的环节.结合 RBAC 模型,提出的权限控制方法,通过动态生成用户功能菜单的方法实现权限控制,使得权限的分配和管理完全动态化,并且对于系统功能的扩展也有很好的支持,只需在数据库中添加相应功能的菜单记录.参考文献:1王超,连小凡 .基于角色访问控制机制在 MIS 权限管理中的应用J.微机发展,2004,14(5):5052.2高右起.权限管理的设计模式J.计算机工程与应用,2003,28:9497
16、.3曾隽芳.电子政务系统基于角色的权限管理研究J.计算机工程与应用,2O04(22):156160.4张洪滨.JBuilder9 集成开发实例解析M. 北京:机械工业出版社,2004.5HallM.Servtet 与 JSP 权威指南M.北京:机械工业出版社,2o02.(上接第 49 页)StatecurremState=readCurrentState(taskid);/从数据库获得当前状态StatstateOwner=newStateOwner(taskid.earreatState);/转换状态currentState=curremState.next(e);if(currentStat
17、e!=nul1)currentState.run(stateOwner);saveCurrentState(stateOwner);/保存当前状态4 结束语状态模式对多分支结构进行了较好的封装,并且能够很容易地进行扩展这种结构.工作流运行服务作为工作流系统的核心,其设计的关键在于它的状态转换.文中结合将状态模式应用到工作流系统中,为工作流状态机的设计提供了解决思路.参考文献:【1GammaE,HelmR,JohnsonR,etai.DesignPatterns:ISlementsofResuableObjectOrientedSoftwareM.北京: 机械工业出版社,2o03.2】CooperJW.Java 设计模式 M.北京:科学出版社,2004.3阎宏.Java 与模式M. 北京:电子工业出版社,2002.4米斯科.设计模式 Java 手册M.北京:中国电力出版社,20O4.【5wfMC.1WorkflowRefelnceModel29 一 Nov 一 1994【Z.WFMCTc 一 1003.1994.报一年