设计模式(20)-状态模式

定义
对象有多种不同的状态,每种状态由相应的动作触发.某状态下可以执行的动作又有限制.
将状态的切换委托给状态管理器

实例
模拟电梯的运行过程:
电梯有四种状态:正在开门,正在关门,正在停止,正在运行
开门动作>进入正在开门状态 只可以关门动作
关门动作>进入正在关门状态 可以开门动作,停止动作(忘了按楼层),运行动作(按楼层)
停止动作>正在停止状态 可以开门动作,可以运行动作
运行动作>正在运行状态 可以关门动作,可以停止动作

1.电梯抽象类

abstract public class Lift {
    //状态管理器
    protected Context context;

    public void setContext(Context context){
        this.context = context;
    }

    abstract public void open();    //开门
    abstract public void close();   //关门
    abstract public void stop();    //停止
    abstract public void run(); //运行
}

2.电梯实现类

public class OpenningStateLift extends Lift{

    @Override
    public void open() {
        System.out.println(".....正在开门状态 .....");
    }

    @Override
    public void close() {
        System.out.println("...执行关门动作,进入正在关门状态...");
        super.context.setLiftState(Context.CLOSING_STATE_LIFT);
    }

    @Override
    public void stop() {
        System.out.println("!!!正在开门状态,无法执行停止动作!!!");
    }

    @Override
    public void run() {
        System.out.println("!!!正在开门状态,无法执行运行动作!!!");
    }
}
public class ClosingStateLift extends Lift{

    @Override
    public void open() {
        System.out.println("...执行开门动作,进入正在开门状态...");
        super.context.setLiftState(Context.OPENNING_STATE_LIFT);
    }

    @Override
    public void close() {
        System.out.println(".....正在关门状态中.....");
    }

    @Override
    public void stop() {
        System.out.println("...执行停止动作,进入正在停止状态...");
        super.context.setLiftState(Context.STOPPING_STATE_LIFT);
    }

    @Override
    public void run() {
        System.out.println("...执行运行动作,进入正在运行状态...");
        super.context.setLiftState(Context.RUNNING_STATE_LIFT);
    }
}
public class RunningStateLift extends Lift{

    @Override
    public void open() {
        System.out.println("!!!正在运行状态,无法执行开门动作!!!");
    }

    @Override
    public void close() {
        System.out.println("!!!正在运行状态,无法执行关门动作!!!");
    }

    @Override
    public void stop() {
        System.out.println("执行停止动作,进入正在停止状态!!!");
        super.context.setLiftState(Context.STOPPING_STATE_LIFT);
    }

    @Override
    public void run() {
        System.out.println(".....正在运行状态.....");
    }
}
public class StoppingStateLift extends Lift{

    @Override
    public void open() {
        System.out.println("...执行开门动作,进入正在开门状态...");
        super.context.setLiftState(Context.OPENNING_STATE_LIFT);
    }

    @Override
    public void close() {
        System.out.println("!!!正在停止状态,无法执行关门动作!!!");
    }

    @Override
    public void stop() {
        System.out.println(".....正在停止状态.....");
    }

    @Override
    public void run() {
        System.out.println("...执行运行动作,进入正在运行状态...");
        super.context.setLiftState(Context.RUNNING_STATE_LIFT);
    }
}

3.电梯状态管理器

public class Context {
    public static final Lift OPENNING_STATE_LIFT = new OpenningStateLift();
    public static final Lift CLOSING_STATE_LIFT = new ClosingStateLift();
    public static final Lift RUNNING_STATE_LIFT = new RunningStateLift();
    public static final Lift STOPPING_STATE_LIFT = new StoppingStateLift();

    //当前是哪个状态的电梯
    private Lift lift;
    public void setLiftState(Lift lift){
        this.lift = lift;
        //为电梯传入状态管理器
        lift.setContext(this);
    }

    public void open(){
        this.lift.open();
    }

    public void close(){
        this.lift.close();
    }

    public void stop(){
        this.lift.stop();
    }

    public void run(){
        this.lift.run();
    }
}

4.运行

public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        //设置初始状态
        context.setLiftState(new ClosingStateLift());

        context.run();
        context.open();
        context.close();
        context.stop();
        context.close();
        context.run();
        context.open();
        context.stop();
        context.stop();
    }
}

结果:

...执行运行动作,进入正在运行状态...
!!!正在运行状态,无法执行开门动作!!!
!!!正在运行状态,无法执行关门动作!!!
...执行停止动作,进入正在停止状态...
!!!正在停止状态,无法执行关门动作!!!
...执行运行动作,进入正在运行状态...
!!!正在运行状态,无法执行开门动作!!!
...执行停止动作,进入正在停止状态...
.....正在停止状态.....

猜你喜欢

转载自blog.csdn.net/chixiaoen/article/details/79507690