美文网首页设计模式程序员
设计模式之状态模式(行为型)

设计模式之状态模式(行为型)

作者: smileNicky | 来源:发表于2018-12-22 16:27 被阅读9次

    模式定义

    一个对象在其内部状态改变时改变其行为,这个对象我们可以称为状态对象,所以状态模式是一种对象行为型模式。

    模式结构

    • Context:环境类
      Context类也可以称之为上下文类,实际上就是拥有状态的对象,可以理解为状态管理器。

    • State:抽象状态类
      抽象状态类可以是一个接口类或者抽象类,反正实现的话都是通过具体状态类。抽象状态类,封装环境类不同状态下的所有动作方法。

    • ConcreteState:具体状态类
      具体实现类就比较容易理解了,就是继承抽象状态类,实现具体的方法,不一定所有的抽象方法都有重写,根据环境类状态的改变进行重写就好,其实也是根据状态改变改变动作方法。

    模式适用场景

    • 状态模式适用于行为随状态改变的业务场景,比如状态改变了,行为也会做成改变。
    • 业务代码中很多条件的情况,加入一些代码有很多的if...else,并且经常改变,这种情况就可以使用状态模式进行编写。

    业务应用场景:

    • 比如OA的审批就可以应用状态模式,发起申请之后,审批状态可能有受理,批准等等状态,每个状态具有不一样的动作;

    • 游戏的角色扮演,每次游戏版本升级都是会出现状态动作的改变,用状态模式进行设计,可以提高程序可拓展性;

    简单实例

    上下文类:

    public class Context {
       private State state;
     
       public Context(){
          state = null;
       }
     
       public void setState(State state){
          this.state = state;     
       }
     
       public State getState(){
          return state;
       }
    }
    

    抽象状态类:

    public abstract class State {
       public void doAction(Context context);
    }
    

    具体状态类:

    public class ConcreteState implements State {
     
       public void doAction(Context context) {
          System.out.println("Player is in start state");
          context.setState(this); 
       }
     
       public String toString(){
          return "Start State";
       }
    }
    

    调用代码:

    public class StatePatternDemo {
       public static void main(String[] args) {
          Context context = new Context();
     
          ConcreteState concreteState = new ConcreteState();
          concreteState.doAction(context);
     
          System.out.println(context.getState().toString());
     
       }
    }
    

    状态模式分类

    状态模式分为简单状态模式和可切换状态模式。

    • 简单状态模式
      简单状态模式就是指状态相对独立,具体状态类可以根据抽象状态类进行编程,也就是不需要用环境类中的setState方法改变状态

    • 可切换状态的状态模式
      可切换状态模式是状态可以变换的,状态变换了,具体状态类在调用时就要使用环境类的setState改变状态

    相关文章

      网友评论

        本文标题:设计模式之状态模式(行为型)

        本文链接:https://www.haomeiwen.com/subject/ataikqtx.html