状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,状态模式使得一个对象在其状态改变时会表现出不同的行为。通过将不同的状态封装成独立的类,并让对象根据状态来调用不同的类来实现状态的切换。
if-else
或 switch
语句State
实例,负责在不同状态之间进行切换public interface ElevatorState {
void pressButton();
void openDoor();
void closeDoor();
void move();
}
public class MovingState implements ElevatorState {
private Elevator elevator;
public MovingState(Elevator elevator) {
this.elevator = elevator;
}
@Override
public void pressButton() {
System.out.println("电梯正在移动,不能按按钮!");
}
@Override
public void openDoor() {
System.out.println("电梯正在移动,不能开门!");
}
@Override
public void closeDoor() {
System.out.println("电梯正在移动,门已经关闭!");
}
@Override
public void move() {
System.out.println("电梯正在移动...");
}
}
public class IdleState implements ElevatorState {
private Elevator elevator;
public IdleState(Elevator elevator) {
this.elevator = elevator;
}
@Override
public void pressButton() {
System.out.println("电梯停在楼层,开始移动...");
elevator.setState(new MovingState(elevator));
}
@Override
public void openDoor() {
System.out.println("电梯开门...");
}
@Override
public void closeDoor() {
System.out.println("电梯门关闭...");
}
@Override
public void move() {
System.out.println("电梯停在当前楼层...");
}
}
public class Elevator {
private ElevatorState state;
public Elevator() {
this.state = new IdleState(this); // 初始状态为待机状态
}
public void setState(ElevatorState state) {
this.state = state;
}
public void pressButton() {
state.pressButton();
}
public void openDoor() {
state.openDoor();
}
public void closeDoor() {
state.closeDoor();
}
public void move() {
state.move();
}
}
public class Client {
public static void main(String[] args) {
Elevator elevator = new Elevator();
elevator.pressButton(); // 输出:电梯停在楼层,开始移动...
elevator.move(); // 输出:电梯正在移动...
elevator.openDoor(); // 输出:电梯正在移动,不能开门!
elevator.setState(new IdleState(elevator)); // 切换到待机状态
elevator.openDoor(); // 输出:电梯开门...
}
}
if-else
语句或状态机状态模式适用于对象的行为依赖于其状态,并且状态之间有明确的转换关系的场景。典型应用包括工作流、状态机、电梯控制系统等。