状态模式(State)是一种行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。在状态模式中,对象的行为取决于其内部状态,而不是取决于其类。
下面是一个简单的状态模式的示例,假设有一个电梯,它有四种状态:停止、运行、开门和关门。在不同的状态下,电梯的行为是不同的。
首先,我们需要定义一个状态接口,它包含了电梯在不同状态下的行为:
public interface ElevatorState {
void openDoor();
void closeDoor();
void run();
void stop();
}
然后,我们需要实现这个接口,定义不同状态下的行为:
public class StopState implements ElevatorState {
@Override
public void openDoor() {
System.out.println("电梯门已打开");
}
@Override
public void closeDoor() {
System.out.println("电梯门已关闭");
}
@Override
public void run() {
System.out.println("电梯开始运行");
}
@Override
public void stop() {
System.out.println("电梯已停止");
}
}
public class RunState implements ElevatorState {
@Override
public void openDoor() {
System.out.println("电梯正在运行,不能开门");
}
@Override
public void closeDoor() {
System.out.println("电梯正在运行,不能关门");
}
@Override
public void run() {
System.out.println("电梯正在运行");
}
@Override
public void stop() {
System.out.println("电梯停止运行");
}
}
public class OpenState implements ElevatorState {
@Override
public void openDoor() {
System.out.println("电梯门已打开");
}
@Override
public void closeDoor() {
System.out.println("电梯门已关闭");
}
@Override
public void run() {
System.out.println("电梯门未关闭,不能运行");
}
@Override
public void stop() {
System.out.println("电梯门未关闭,不能停止");
}
}
public class CloseState implements ElevatorState {
@Override
public void openDoor() {
System.out.println("电梯门已打开");
}
@Override
public void closeDoor() {
System.out.println("电梯门已关闭");
}
@Override
public void run() {
System.out.println("电梯开始运行");
}
@Override
public void stop() {
System.out.println("电梯已停止");
}
}
最后,我们需要定义一个电梯类,它包含了当前状态和状态转换的方法:
public class Elevator {
private ElevatorState state;
public Elevator() {
state = new StopState();
}
public void setState(ElevatorState state) {
this.state = state;
}
public void openDoor() {
state.openDoor();
}
public void closeDoor() {
state.closeDoor();
}
public void run() {
state.run();
}
public void stop() {
state.stop();
}
}
现在,我们可以使用这个电梯类来模拟电梯的运行过程:
public class Main {
public static void main(String[] args) {
Elevator elevator = new Elevator();
elevator.openDoor();
elevator.closeDoor();
elevator.run();
elevator.stop();
elevator.openDoor();
elevator.closeDoor();
}
}
输出结果为:
电梯门已打开 电梯门已关闭 电梯开始运行 电梯已停止 电梯门已打开 电梯门已关闭
可以看到,在不同的状态下,电梯的行为是不同的。状态模式可以帮助我们更好地管理对象的状态,使得对象的行为更加灵活和可扩展。