行为型设计模式-状态模式

来源:互联网 发布:cydia不能安装软件 编辑:程序博客网 时间:2024/06/14 00:57

状态模式:

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

状态模式参与角色:

上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,
将与状态相关的操作委托给当前的Concrete State对象来处理。

抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。

具体状态(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

0 0
原创粉丝点击