状态模式
允许1个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
角色
-
上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理
-
抽象状态(State):定义1个接口以封装使用上下文环境的的1个特定状态相关的行为
-
具体状态(Concrete State):实现抽象状态定义的接口
上下文环境:Context
package com.zhiwei.state;public class Context { /** * 上下文内部维护的状态对象,使用接口是为了管理一类的接口可引用的对象实现状态的转移,同时可以了解上下文的状态 */ private State state; /** * 上下文实例化时设置上下文的的出初始状态 */ public Context() { state = new CreatingState(); } /** * 获取上下文当前的状态信息 * @return */ public State getState() { return state; } /** * 状态转移时重新设置新的状态 * @param state */ public void setState(State state) { this.state = state; } public void handle() { //处理状态改变的事件:本质调用具体状态对象的回掉方法,在状态对象内部设置新的状态 state.handle(this); }}
抽象状态:State
public interface State { /** * 处理本状态下的业务逻辑,同时设置上下文流程的下一种状态 * @param document */ void handle(Context context);}
具体状态:列表
package com.zhiwei.state;/** * 公文创建状态对象 * @author Yang ZhiWei * */public class CreatingState implements State { /** * 状态对象实际的业务逻辑处理,处理完成之后 * 设置下一步流程的上下文状态 */ public void handle(Context context) { System.out.println("公文已创建完成......"); context.setState(new CreatedState()); }}
package com.zhiwei.state;public class CreatedState implements State { public void handle(Context context) { System.out.println("公文已发送一级主管......"); context.setState(new SendOneChargeState()); }}
package com.zhiwei.state;public class SendOneChargeState implements State { public void handle(Context context) { //一级主管应该处理代码 System.out.println("公文已发送一级主管......"); context.setState(new SendSuperChargeState()); }}
package com.zhiwei.state;public class SendSuperChargeState implements State { public void handle(Context context) { //二级主管应该处理的代码 context.setState(new ApprovedState()); System.out.println("公文已审批完成......"); }}
package com.zhiwei.state;public class ApprovedState implements State { public void handle(Context context) { //审批完成应该处理代码 System.out.println("公文已结束......"); }}
测试代码:
//初始化上下文对象,并设置初始状态Context context = new Context(); context.handle(); context.handle();context.handle();context.handle();context.handle();
通俗解释:
员工A要辞职,A首先填好辞职申请书(上下文对象),整个公司的辞职流程审批链:
组长-->主管-->经理-->人力资源部(状态),只有每个流程都走完才行。
特点:用于处理一个确定的工作流程,如果分层次处理对应的流程的话,可使用责任链模式(一步到位),就不需为每个不同的对象设计不同的工作流程。
工作流产品:Activiti/JBPM