状态模式

当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,并且状态数量比较多时,就可以考虑使用状态模式。

状态模式的结构

  1. 状态接口(State Interface):定义了具体状态类(Concrete State)必须实现的方法。这些方法通常表示对象在该状态下可以执行的操作。

  2. 具体状态类(Concrete State):实现了状态接口,并定义了在特定状态下对象的行为。

  3. 环境类(Context):维护一个对当前状态对象的引用,并将客户端请求委派给当前状态对象处理。

状态模式的实现方式

  1. 定义状态接口(State Interface):该接口定义了状态类必须实现的方法,这些方法表示对象在该状态下可以执行的操作。

  2. 实现具体状态类(Concrete State):每个具体状态类实现了状态接口,并定义了在特定状态下对象的行为。每个状态类负责管理自己的状态转换逻辑。

  3. 定义环境类(Context):环境类维护对当前状态对象的引用,并将客户端的请求委派给当前状态对象处理。环境类提供了公共的接口供客户端使用。

  4. 在环境类中管理状态转换:环境类可以提供方法用于切换状态,这些方法负责更新当前状态对象,以及在不同状态下执行相应的操作。

  5. 客户端使用:客户端通过调用环境类的方法来使用状态模式。客户端无需知道具体状态类的存在,只需与环境类进行交互即可。

例子

public class OnState implements TVState {
public void turnOn() {
System.out.println("电视机已经处于开机状态");
}
public void turnOff() {
System.out.println("电视机正在关机...");
// 切换到关机状态
TV.setState(new OffState());
}
public void mute() {
System.out.println("电视机正在静音...");
// 切换到静音状态
TV.setState(new MuteState());
}
}
public class OffState implements TVState {
public void turnOn() {
System.out.println("电视机正在开机...");
// 切换到开机状态
TV.setState(new OnState());
}
public void turnOff() {
System.out.println("电视机已经处于关机状态");
}
public void mute() {
System.out.println("电视机处于关机状态,无法静音");
}
}
public class MuteState implements TVState {
public void turnOn() {
System.out.println("电视机已经处于开机状态");
}
public void turnOff() {
System.out.println("电视机正在关机...");
// 切换到关机状态
TV.setState(new OffState());
}
public void mute() {
System.out.println("电视机已经处于静音状态");
}
}
// 环境类(Context)来维护当前电视机的状态
public class TV {
private static TVState currentState;
public static void setState(TVState state) {
currentState = state;
}
public static void turnOn() {
currentState.turnOn();
}
public static void turnOff() {
currentState.turnOff();
}
public static void mute() {
currentState.mute();
}
}

现在,我们可以通过调用环境类的方法来使用状态模式:

TV.turnOn(); // 输出:电视机正在开机...
TV.mute(); // 输出:电视机正在静音...
TV.turnOff(); // 输出:电视机正在关机...
TV.mute(); // 输出:电视机处于关机状态,无法静音