定义
对象有多种不同的状态,每种状态由相应的动作触发.某状态下可以执行的动作又有限制.
将状态的切换委托给状态管理器
实例
模拟电梯的运行过程:
电梯有四种状态:正在开门,正在关门,正在停止,正在运行
开门动作>进入正在开门状态 只可以关门动作
关门动作>进入正在关门状态 可以开门动作,停止动作(忘了按楼层),运行动作(按楼层)
停止动作>正在停止状态 可以开门动作,可以运行动作
运行动作>正在运行状态 可以关门动作,可以停止动作
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();
}
}
结果:
...执行运行动作,进入正在运行状态...
!!!正在运行状态,无法执行开门动作!!!
!!!正在运行状态,无法执行关门动作!!!
...执行停止动作,进入正在停止状态...
!!!正在停止状态,无法执行关门动作!!!
...执行运行动作,进入正在运行状态...
!!!正在运行状态,无法执行开门动作!!!
...执行停止动作,进入正在停止状态...
.....正在停止状态.....