设计模式之状态模式

2019-04-11  本文已影响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.易扩展

使用场景

使用

上一篇 下一篇

猜你喜欢

热点阅读