美文网首页
设计模式之状态模式

设计模式之状态模式

作者: 古月沧澜 | 来源:发表于2019-04-11 14:09 被阅读0次

案列

电梯在不同状态下的业务逻辑以及状态的切换

设计图

代码

1.抽象状态类

/**
 * Created by Administrator on 2019/4/6.
 * 电梯状态抽象类,定义状态的模板方法,引用电梯的上下文环境类实现类的状态的切换。
 */
public abstract class IliftState {

    protected StateContext stateContext;


    public void setStateContext(StateContext stateContext) {
        this.stateContext = stateContext;
    }

    public abstract void stop();
    public abstract void start();
    public abstract void open();
    public abstract  void close();


}

2.开启状态

/**
 * Created by Administrator on 2019/4/6.
 */
public class OpenState extends IliftState {
    @Override
    public void stop() {

    }

    @Override
    public void start() {

    }

    @Override
    public void open() {
       System.out.println("电梯打开");
    }

    @Override
    public void close() {
      super.stateContext.setLiftState(StateContext.closeState);
      super.stateContext.close();
    }
}

3.关闭状态

/**
 * Created by Administrator on 2019/4/6.
 */
public class CloseState extends IliftState{
    @Override
    public void stop() {
        super.stateContext.setLiftState(StateContext.stopState);
        super.stateContext.stop();
    }

    @Override
    public void start() {
        super.stateContext.setLiftState(StateContext.startState);
        super.stateContext.start();
    }

    @Override
    public void open() {
        super.stateContext.setLiftState(StateContext.openState);
        super.stateContext.open();
    }

    @Override
    public void close() {
        System.out.println("电梯关门了");
    }
}

4.启动状态

/**
 * Created by Administrator on 2019/4/6.
 */
public class StartState extends IliftState{
    @Override
    public void stop() {
        super.stateContext.setLiftState(StateContext.stopState);
        super.stateContext.stop();
    }

    @Override
    public void start() {
         System.out.println("电梯启动了");
    }

    @Override
    public void open() {

    }

    @Override
    public void close() {

    }
}

5.停止状态

/**
 * Created by Administrator on 2019/4/6.
 * 停止状态,可切换到开启状态、关闭状态和启动状态
 */
public class StopState extends IliftState{
    @Override
    public void stop() {
        System.out.println("电梯停了");
    }

    @Override
    public void start() {
        super.stateContext.setLiftState(StateContext.startState);
        super.stateContext.start();
    }

    @Override
    public void open() {
        super.stateContext.setLiftState(StateContext.openState);
        super.stateContext.open();
    }

    @Override
    public void close() {
        super.stateContext.setLiftState(StateContext.closeState);
        super.stateContext.close();
    }
}

5.状态环境类

/**
 * Created by Administrator on 2019/4/6.
 * 状态模式的环境角色类,负责状态切换,类似于工作流中的状态机。
 * 状态机会实现状态类中的所有方法,具体实现委托给对应的状态实现。
 * 默认会给一个初始状态
 */
public class StateContext {
    public final static StopState stopState=new StopState();
    public final static StartState startState=new StartState();
    public final static OpenState openState=new OpenState();
    public final static CloseState closeState=new CloseState();

    //需要初始化一个状态
    private IliftState liftState;


    public IliftState getLiftState() {
        return liftState;
    }

    public void setLiftState(IliftState liftState) {
        this.liftState = liftState;
        //切换状态的依赖,将环境传递到各个状态的类中去。
        this.liftState.setStateContext(this);
    }

    public void stop(){
        liftState.stop();
    }

    public void start(){
        liftState.start();
    }

    public void close(){
        liftState.close();
    }

    public void open(){
        liftState.open();
    }
}

6.场景类

/**
 * Created by Administrator on 2019/4/6.
 * 状态模式只有一个问题,就是类膨胀的问题,其他的都封装的听会挺好。
 * 封装状态的变化,状态的变化,
 */
public class Client {

    public static void main(String[]args){
        StateContext stateContext=new StateContext();
        stateContext.setLiftState(new CloseState());
        stateContext.close();
        stateContext.start();
        stateContext.stop();
        stateContext.open();
    }
}

7.运行结果

电梯关门了
电梯启动了
电梯停了
电梯打开

通用类图

1.含义:

对象的行为随着状态的变化而变化

2.设计图
3.角色说明

抽象状态类:引入状态环境类,定义两个方法,分别为本状态行为管理和趋向行为管理
具体状态类:实现抽象状态类,定义具体的几种状态
状态环境类:引入所有的具体状态,默认实现抽象状态类的所有方法,实现委托给具体的状态类,实现状态的切换。

4.代码

1.抽象状态类

/**
* Created by Administrator on 2019/4/6.
* 抽象状态类,引入状态环境类,定义两个方法,分别为本状态行为管理和趋向行为管理。
*/
public abstract class AbstractState {
   protected StateContext stateContext;

   public void setStateContext(StateContext stateContext) {
       this.stateContext = stateContext;
   }

   public abstract void handle1();
   public abstract void handle2();
}

2.具体状态1

/**
 * Created by Administrator on 2019/4/6.
 */
public class ConcreteState1 extends AbstractState{
    @Override
    public void handle1() {
        //本状态行为管理
    }

    @Override
    public void handle2() {
      super.stateContext.setAbstractState(StateContext.concreteState2);
      super.stateContext.handle2();
    }
}

3.具体状态2

/**
 * Created by Administrator on 2019/4/6.
 */
public class ConcreteState2  extends AbstractState {
    @Override
    public void handle1() {
        super.stateContext.setAbstractState(StateContext.concreteState1);
        super.stateContext.handle1();
    }

    @Override
    public void handle2() {
        //本状态行为管理
    }
}

4.状态环境类

/**
 * Created by Administrator on 2019/4/6.
 */
public class StateContext {

    //状态对象默认为fianl和static的。
    public    final static ConcreteState1 concreteState1=new ConcreteState1();
    public    final static ConcreteState2 concreteState2=new ConcreteState2();


    private AbstractState abstractState;

    public AbstractState getAbstractState() {
        return abstractState;
    }

    public void setAbstractState(AbstractState abstractState) {
        this.abstractState = abstractState;
        this.abstractState.setStateContext(this);
    }

    //默认实现状态中的所有方法,具体实现委托给状态类
    public  void handle1(){
        abstractState.handle1();
    };
    public  void handle2(){
        abstractState.handle2();
    };
}

优势

1.易扩展

使用场景

使用

相关文章

  • Java设计模式——状态模式

    Java设计模式之状态模式 这期分享一个行为模式中的状态模式,状态模式是行为模式中的最后几个模式了。希望多多关注交...

  • 设计模式之状态设计模式

    一、浩言 人静而后安,安而能后定,定而能后慧,慧而能后悟,悟而能后得。 二、背景 开年,看了看最近网上传的《阿里巴...

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • 设计模式之状态模式

    状态模式 State Intro 状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来...

  • 设计模式之状态模式

    1. 定义 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。它是一种对象行为型模式。 2....

  • 设计模式之状态模式

    状态模式的定义 状态模式的定义如下:Allow an object to alter its behavior w...

  • 设计模式之状态模式

    在开发过程中,我们经常会遇到很多if-else的判断,有的会有很多层,当然也不是说所有的涉及到if-else判断的...

  • 设计模式之状态模式

    UML图: 没怎么完全理解,略过。

  • 设计模式之状态模式

    状态模式 汽车人接口 变形金刚的汽车型状态 变形金刚的战斗型状态 用来管理切换状态的类 客户端 状态模式的场景一个...

  • 设计模式之状态模式

    写在前面 最近写屏幕式智能家电的时候,总是需要处理各种电器状态,比如电源开启的情况下才可以进行开风机操作,风力档位...

网友评论

      本文标题:设计模式之状态模式

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