`
状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,看起来就像是对象的类发生了改变。状态模式将状态封装成独立的类,并将对状态的行为委托给当前状态对象。
假设我们要设计一个电梯系统,其中电梯有三种状态:停止状态、运行状态和故障状态。不同状态下电梯的行为不同。
首先,我们定义一个状态接口(State Interface),其中包含了所有可能的行为方法,如openDoor()、closeDoor()、goUp()和goDown()。
然后,我们为每种状态创建一个具体状态类(Concrete State),这些类实现了状态接口并提供了对应的行为方法。例如,StopState类实现了openDoor()和closeDoor()方法,在这些方法中可以定义电梯停止状态下的操作逻辑。
接下来,我们在电梯类中维护一个当前状态对象,并在各个行为方法中调用当前状态对象的对应方法。例如,电梯类的openDoor()方法可以直接调用当前状态对象的openDoor()方法。
最后,我们在应用程序中创建一个电梯对象,并通过调用电梯对象的方法来触发相应的行为。
下是使用Java语言实现状态模式的示例代码:
// 状态接口
interface State {
void openDoor();
void closeDoor();
void goUp();
void goDown();
}
// 停止状态
class StopState implements State {
private Elevator context;
public StopState(Elevator elevator) {
this.context = elevator;
}
@Override
public void openDoor() {
System.out.println("电梯门已打开");
}
@Override
public void closeDoor() {
System.out.println("电梯门已关闭");
}
@Override
public void goUp() {
System.out.println("电梯开始上升");
// 切换到运行状态
context.setState(new RunState(context));
}
@Override
public void goDown() {
System.out.println("电梯开始下降");
// 切换到运行状态
context.setState(new RunState(context));
}
}
// 运行状态
class RunState implements State {
private Elevator context;
public RunState(Elevator elevator) {
this.context = elevator;
}
@Override
public void openDoor() {
System.out.println("电梯正在运行,无法打开门");
}
@Override
public void closeDoor() {
System.out.println("电梯正在运行,无需关闭门");
}
@Override
public void goUp() {
System.out.println("电梯继续上升");
}
@Override
public void goDown() {
System.out.println("电梯继续下降");
}
}
// 故障状态
class FaultState implements State {
private Elevator context;
public FaultState(Elevator elevator) {
this.context = elevator;
}
@Override
public void openDoor() {
System.out.println("电梯故障,无法打开门");
}
@Override
public void closeDoor() {
System.out.println("电梯故障,无需关闭门");
}
@Override
public void goUp() {
System.out.println("电梯故障,无法上升");
}
@Override
public void goDown() {
System.out.println("电梯故障,无法下降");
}
}
// 电梯类
class Elevator {
private State state;
public Elevator() {
this.state = new StopState(this);
}
public void setState(State state) {
this.state = state;
}
public void openDoor() {
state.openDoor();
}
public void closeDoor() {
state.closeDoor();
}
public void goUp() {
state.goUp();
}
public void goDown() {
state.goDown();
}
}
// 应用程序
public class Main {
public static void main(String[] args) {
Elevator elevator = new Elevator();
elevator.openDoor(); // 输出:电梯门已打开
elevator.closeDoor(); // 输出:电梯门已关闭
elevator.goUp(); // 输出:电梯开始上升
elevator.closeDoor(); // 输出:电梯正在运行,无需关闭门
elevator.goDown(); // 输出:电梯继续下降
}
}
这是一个简单的使用状态模式实现的电梯系统示例。通过状态模式,可以根据电梯的不同状态来执行相应的行为,从而实现了状态和行为的解耦,使得代码更加灵活和可维护。
状态模式适用于当对象的行为取决于其内部状态,并且状态可能在运行时发生变化的情况。它可以帮助我们实现清晰的状态转换逻辑,提高代码的可维护性和扩展性。