java设计模式--状态模式

Posted rhodesis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式--状态模式相关的知识,希望对你有一定的参考价值。

状态模式

  状态模式是对象行为型模式,为了允许一个对象在其内部的状态改变时,修改其行为,这样看起来似乎是修改了它的类一样。状态模式实际上就是统一状态的变化来影响行为,比如一个简单的申请流程,发起-审批-结束,当状态为发起时,该条事务由发起人发起流程;状态为审批时,该条事务变成审批人审批;状态为结束时,该条事务由归档人归档,这个就是状态模式的一种应用。由在我们日常开发时,经常会碰到许多if......else......的情况,同时每个情况里面都需要做复杂的操作,我们会把每个if...else...里面的操作单独抽出来

状态模式的适用性

  • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态来改变它的行为。

  • 一个操作中包含大量分支的条件语句,且这些分支依赖于该对象的状态,同时状态分支还有可能继续增加。

状态模式的结构图

技术图片

状态模式中,总共包含三类角色:

1、环境角色(Context):定义了客户感兴趣的接口,同时维护了ConcreteState类的实例,这个实例定义了当前状态。

2、抽象状态角色(State):定义一个接口以封装与Context的一个特定状态相关的行为。

3、具体状态角色(ConcreteState):每一子类实现一个与Context的一个状态相关的行为。

 

状态模式示例

  抽象状态角色,定义状态对应的执行方法

public interface State 
    public void handle();

  具体状态角色,分别定义状态A和状态B对应的行为

public class ConcreteStateA implements State 
    @Override
    public void handle() 
        System.out.println("状态A执行的操作");
    
public class ConcreteStateB implements State 
    @Override
    public void handle() 
        System.out.println("状态B执行的操作");
    

  环境对象,通过设置不同的状态使得同一种方法执行不同的操作

public class Context 
    private State state;

    public void setState(State state) 
        this.state = state;
    
    /*用户感兴趣的方法*/
    public void Request() 
        state.handle();
    

  客户端

public class Client 
    public static void main(String[] args) 
        Context context=new Context();
        State concreteStateA=new ConcreteStateA();
        State concreteStateB =new ConcreteStateB();
        /*分别执行状态A状态B对应的操作*/
        context.setState(concreteStateA);
        context.Request();
        context.setState(concreteStateB);
        context.Request();
    

/*
运行结果:
        状态A执行的操作
        状态B执行的操作*/

总结

  状态模式一般在业务系统中业务流程的管理上用的比较多,对同一件事务定义不同的状态而执行不同的行为,其次,状态模式使得事务的整体处理上非常清晰,避免了一大片条件判断语句使得代码可读性较差,扩展性不强,同时该模式将状态的变化封装在了类的内部来实现,外界不知道状态是如何处理变化的,但是状态模式需要对每个状态的行为构建一个具体状态类,这样也会使得子类比较多。

 

以上是关于java设计模式--状态模式的主要内容,如果未能解决你的问题,请参考以下文章

Java与设计模式-状态模式

java设计模式--状态模式

Java设计模式学习记录-状态模式

从零开始学习Java设计模式 | 行为型模式篇:状态模式

从零开始学习Java设计模式 | 行为型模式篇:状态模式

Java中,状态模式和策略模式的区别