3、状态模式(State)
意图
允许在对象内部状态改变时,改变它的运行状态
实现
public class Elevator {
private ElevatorState openState;
private ElevatorState closeState;
private ElevatorState runState;
private ElevatorState stopState;
private ElevatorState elevatorState;
public Elevator() {
openState = new ElevatorOpenState(this);
closeState = new ElevatorCloseState(this);
runState = new ElevatorRunState(this);
stopState = new ElevatorStopState(this);
setElevatorState(stopState);
}
public void open() {
elevatorState.open();
}
public void close() {
elevatorState.close();
}
public void stop() {
elevatorState.stop();
}
public void run() {
elevatorState.run();
}
public void setElevatorState(ElevatorState elevatorState) {
this.elevatorState = elevatorState;
}
public ElevatorState getCloseState() {
return closeState;
}
public ElevatorState getOpenState() {
return openState;
}
public ElevatorState getRunState() {
return runState;
}
public ElevatorState getStopState() {
return stopState;
}
}
public class ElevatorCloseState implements ElevatorState {
private Elevator elevator;
public ElevatorCloseState(Elevator elevator) {
this.elevator = elevator;
}
@Override
public void open() {
System.out.println("电梯门正在打开");
elevator.setElevatorState(elevator.getOpenState());
}
@Override
public void close() {
System.out.println("电梯门已经关闭");
}
@Override
public void run() {
System.out.println("电梯即将运行");
elevator.setElevatorState(elevator.getRunState());
}
@Override
public void stop() {
System.out.println("电梯已停止");
}
}
public class ElevatorOpenState implements ElevatorState {
private Elevator elevator;
public ElevatorOpenState(Elevator elevator) {
this.elevator = elevator;
}
@Override
public void open() {
System.out.println("电梯门已经打开");
}
@Override
public void close() {
System.out.println("电梯门正在关闭");
elevator.setElevatorState(elevator.getCloseState());
}
@Override
public void run() {
System.out.println("电梯门未关闭无法运行");
}
@Override
public void stop() {
System.out.println("电梯已经停止");
}
}
public class ElevatorRunState implements ElevatorState {
private Elevator elevator;
public ElevatorRunState(Elevator elevator) {
this.elevator = elevator;
}
@Override
public void stop() {
System.out.println("电梯即将停止");
elevator.setElevatorState(elevator.getStopState());
}
@Override
public void open() {
System.out.println("电梯运行,无法开门");
}
@Override
public void close() {
System.out.println("电梯门已关闭");
}
@Override
public void run() {
System.out.println("电梯正在运行");
}
}
public class ElevatorStopState implements ElevatorState {
private Elevator elevator;
public ElevatorStopState(Elevator elevator) {
this.elevator = elevator;
}
@Override
public void open() {
System.out.println("电梯门正在被打开");
elevator.setElevatorState(elevator.getOpenState());
}
@Override
public void close() {
System.out.println("电梯门已经关闭");
}
@Override
public void run() {
System.out.println("电梯即将运行");
elevator.setElevatorState(elevator.getRunState());
}
@Override
public void stop() {
System.out.println("电梯已停止");
}
}
public interface ElevatorState {
void open();
void close();
void run();
void stop();
}
public class Client {
public static void main(String[] args) {
Elevator elevator = new Elevator();
elevator.open();
elevator.close();
elevator.run();
elevator.open();
elevator.stop();
elevator.open();
}
}
运行结果
电梯门正在被打开
电梯门正在关闭
电梯即将运行
电梯运行,无法开门
电梯即将停止
电梯门正在被打开