示例类图
示例代码
抽象状态
- 在抽象状态层组合进了一个上下文对象;
- 上下文对象中也会组合进一个抽象状态;
- 上下文对象和状态对象之间的关系是你中有我,我中有你;
- 这种循环引用的关系,既可以让上下文对象改变状态对象中的状态,也让状态对象在下游状态中(上下文中的当前状态为上游状态,由当前状态调用的自己的下一个状态称作下游状态)可以更改上下文对象的当前状态,并让此时的当前状态对象表现出当前状态该有的表现;
public abstract class LiftState {
protected Context context;
public void setContext(Context context) {
this.context = context;
}
public abstract void open();
public abstract void close();
public abstract void stop();
public abstract void run();
}
上下文对象
- 上下文对象中组合进了状态对象;
- 在组合进一个状态(或变更组合进的状态)的同时,也让新组合进来的状态对象组合了当前上下文对象,即你中有我我中有你;
public class Context {
public final static OpeningState openingState = new OpeningState();
public final static ClosingState closingState = new ClosingState();
public final static StoppingState stoppingState = new StoppingState();
public final static RunningState runningState = new RunningState();
private LiftState liftState;
public LiftState getLiftState() {
return liftState;
}
public void setLiftState(LiftState liftState) {
this.liftState = liftState;
this.liftState.setContext(this);
}
public void open() {
this.liftState.open();
}
public void close() {
this.liftState.close();
}
public void stop() {
this.liftState.stop();
}
public void run() {
this.liftState.run();
}
}
具体状态
public class OpeningState extends LiftState {
@Override
public void open() {
System.out.println("电梯开门");
}
@Override
public void close() {
super.context.setLiftState(Context.closingState);
super.context.getLiftState().close();
}
@Override
public void stop() {
// do nothing
}
@Override
public void run() {
// do nothing
}
}
public class ClosingState extends LiftState {
@Override
public void open() {
super.context.setLiftState(Context.openingState);
super.context.getLiftState().open();
}
@Override
public void close() {
System.out.println("电梯关门");
}
@Override
public void stop() {
super.context.setLiftState(Context.stoppingState);
super.context.getLiftState().stop();
}
@Override
public void run() {
super.context.setLiftState(Context.runningState);
super.context.getLiftState().run();
}
}
public class RunningState extends LiftState {
@Override
public void open() {
// do nothing
}
@Override
public void close() {
// to nothing
}
@Override
public void stop() {
super.context.setLiftState(Context.stoppingState);
super.context.getLiftState().stop();
}
@Override
public void run() {
System.out.println("电梯运行");
}
}
public class StoppingState extends LiftState {
@Override
public void open() {
super.context.setLiftState(Context.openingState);
super.context.getLiftState().open();
}
@Override
public void close() {
// do nothing
}
@Override
public void stop() {
System.out.println("电梯停了");
}
@Override
public void run() {
super.context.setLiftState(Context.runningState);
super.context.getLiftState().run();
}
}
客户端
public class Client {
public static void main(String[] args) {
Context lift = new Context();
lift.setLiftState(new ClosingState());
lift.open();
lift.close();
lift.run();
lift.stop();
}
}
输出
电梯开门
电梯关门
电梯运行
电梯停了