当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,并且状态数量比较多时,就可以考虑使用状态模式。
状态接口(State Interface):定义了具体状态类(Concrete State)必须实现的方法。这些方法通常表示对象在该状态下可以执行的操作。
具体状态类(Concrete State):实现了状态接口,并定义了在特定状态下对象的行为。
环境类(Context):维护一个对当前状态对象的引用,并将客户端请求委派给当前状态对象处理。
定义状态接口(State Interface):该接口定义了状态类必须实现的方法,这些方法表示对象在该状态下可以执行的操作。
实现具体状态类(Concrete State):每个具体状态类实现了状态接口,并定义了在特定状态下对象的行为。每个状态类负责管理自己的状态转换逻辑。
定义环境类(Context):环境类维护对当前状态对象的引用,并将客户端的请求委派给当前状态对象处理。环境类提供了公共的接口供客户端使用。
在环境类中管理状态转换:环境类可以提供方法用于切换状态,这些方法负责更新当前状态对象,以及在不同状态下执行相应的操作。
客户端使用:客户端通过调用环境类的方法来使用状态模式。客户端无需知道具体状态类的存在,只需与环境类进行交互即可。
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(); // 输出:电视机处于关机状态,无法静音