一、简介
1、定义
状态模式 (State Pattern)是一种行为型设计模式,允许对象在内部状态改变时改变它的行为。通过定义状态接口和具体状态类,将对象的状态和行为分开,使得状态改变时可以改变行为。
2、状态模式的结构
状态模式涉及以下几个角色:
State(状态接口):定义了状态类的共同接口,所有具体的状态类都实现这个接口。
ConcreteState(具体状态类):每个具体的状态类实现了State接口,并定义了在该状态下的具体行为。
Context(上下文):上下文类维护一个当前状态的引用,它通常会委托给具体的状态类来执行相应的状态切换。
二、Java实现案例
1、电灯开关状态案例
java">/*** @Description: 状态接口* @Date: 2025-02-07 17:09* @Author: gaoyufei**/
public interface State {void handle(Switch context);
}/*** @Description: 关灯状态* @Date: 2025-02-07 17:12* @Author: gaoyufei**/
public class CloseState implements State{@Overridepublic void handle(Switch switcher) {switcher.setState(new OpenState());System.out.println("开灯了");}
}
/*** @Description: 开灯状态* @Date: 2025-02-07 17:11* @Author: gaoyufei**/
public class OpenState implements State{@Overridepublic void handle(Switch switcher) {switcher.setState(new CloseState());System.out.println("关灯了");}
}
/*** @Description: 开关,持有灯的状态* @Date: 2025-02-07 17:08* @Author: gaoyufei**/
public class Switch {private State state;public Switch(State state){this.state=state;}public void setState(State state){this.state=state;}public void press(){state.handle(this);}
}/*** @Description: 操作人* @Date: 2025-02-07 17:14* @Author: gaoyufei**/
public class Operator {public static void main(String[] args) throws InterruptedException {Switch switcher=new Switch(new CloseState());//初始状态是关灯//模拟每隔1秒按压一下开关while (true){Thread.sleep(1000);switcher.press();}}
}
2、番茄工作法状态案例
java">/*** @Description: 番茄状态接口* @Date: 2025-02-08 10:49* @Author: gaoyufei**/
public interface TomatoState {void deal(Worker worker);
}/*** @Description: 番茄-工作状态类* @Date: 2025-02-08 10:51* @Author: gaoyufei**/
public class WorkTomatoState implements TomatoState {@Overridepublic void deal(Worker worker) {System.out.println("休息结束了,开始工作吧");try {Thread.sleep(25*60*1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("工作了25分钟");worker.setTomatoState(new RestTomatoState());}
}/*** @Description: 番茄-休息状态类* @Date: 2025-02-08 10:53* @Author: gaoyufei**/
public class RestTomatoState implements TomatoState{@Overridepublic void deal(Worker worker) {System.out.println("工作结束了,好好休息吧");try {Thread.sleep(5*60*1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("休息了5分钟");worker.setTomatoState(new WorkTomatoState());}
}/*** @Description: 工作者* @Date: 2025-02-08 10:51* @Author: gaoyufei**/
public class Worker {private TomatoState tomatoState;public Worker(TomatoState tomatoState){this.tomatoState=tomatoState;}public void setTomatoState(TomatoState tomatoState){this.tomatoState=tomatoState;}public void startTomatoClock(){this.tomatoState.deal(this);}
}/*** @Description: 客户端* @Date: 2025-02-08 11:02* @Author: gaoyufei**/
public class Client {public static void main(String[] args) {Worker worker=new Worker(new WorkTomatoState());while (true){worker.startTomatoClock();}}
}
3、电梯状态案例
这是一个简单的电梯系统。电梯的状态有关门、开门、上升、下降、停止。每个状态下电梯的行为不同。通过状态模式,根据电梯的不同状态执行不同的行为。
java">/*** @Description: 电梯状态接口* @Date: 2025-02-08 9:02* @Author: gaoyufei**/
public interface ElevatorState {void openDoor();void closeDoor();void moveUp();void moveDown();void stop();
}
/*** @Description: 关门状态* @Date: 2025-02-08 9:05* @Author: gaoyufei**/
public class CloseState implements ElevatorState {private Elevator elevator;public CloseState(Elevator elevator){this.elevator=elevator;}@Overridepublic void openDoor() {System.out.println("电梯门开了");elevator.setCurrentState(elevator.getOpenState());}@Overridepublic void closeDoor() {System.out.println("电梯门已经关了");}@Overridepublic void moveUp() {System.out.println("电梯上升");elevator.setCurrentState(elevator.getMovingUpState());}@Overridepublic void moveDown() {System.out.println("电梯下降");elevator.setCurrentState(elevator.getMovingDownState());}@Overridepublic void stop() {System.out.println("电梯停止");elevator.setCurrentState(elevator.getStopState());}
}/*** @Description: 开门状态* @Date: 2025-02-08 9:07* @Author: gaoyufei**/
public class OpenState implements ElevatorState{private Elevator elevator;public OpenState(Elevator elevator){this.elevator=elevator;}@Overridepublic void openDoor() {System.out.println("电梯门已经打开");}@Overridepublic void closeDoor() {System.out.println("电梯门关了");elevator.setCurrentState(elevator.getCloseState());}@Overridepublic void moveUp() {System.out.println("电梯门打开状态,不能上升");}@Overridepublic void moveDown() {System.out.println("电梯门打开状态,不能下降");}@Overridepublic void stop() {System.out.println("电梯门打开状态,不能变换为停止状态");}
}/*** @Description: 停止状态* @Date: 2025-02-08 9:59* @Author: gaoyufei**/
public class StopState implements ElevatorState{private Elevator elevator;public StopState(Elevator elevator){this.elevator=elevator;}@Overridepublic void openDoor() {System.out.println("电梯门开了");elevator.setCurrentState(elevator.getOpenState());}@Overridepublic void closeDoor() {System.out.println("电梯门关了");elevator.setCurrentState(elevator.getCloseState());}@Overridepublic void moveUp() {System.out.println("电梯上升");elevator.setCurrentState(elevator.getMovingUpState());}@Overridepublic void moveDown() {System.out.println("电梯下降");elevator.setCurrentState(elevator.getMovingDownState());}@Overridepublic void stop() {System.out.println("电梯停止");}
}
/*** @Description: 上升状态* @Date: 2025-02-08 9:07* @Author: gaoyufei**/
public class MovingUpState implements ElevatorState{private Elevator elevator;public MovingUpState(Elevator elevator){this.elevator=elevator;}@Overridepublic void openDoor() {System.out.println("电梯正在上升,不能开门");}@Overridepublic void closeDoor() {System.out.println("电梯已经关门");}@Overridepublic void moveUp() {System.out.println("电梯正在上升");}@Overridepublic void moveDown() {System.out.println("电梯下降");elevator.setCurrentState(elevator.getMovingDownState());}@Overridepublic void stop() {System.out.println("电梯停止");elevator.setCurrentState(elevator.getStopState());}
}/*** @Description: 下降状态* @Date: 2025-02-08 9:08* @Author: gaoyufei**/
public class MovingDownState implements ElevatorState{private Elevator elevator;public MovingDownState(Elevator elevator){this.elevator=elevator;}@Overridepublic void openDoor() {System.out.println("电梯正在下降,不能开门");}@Overridepublic void closeDoor() {System.out.println("电梯正在下降,已经关门了");}@Overridepublic void moveUp() {System.out.println("电梯上升");elevator.setCurrentState(elevator.getMovingUpState());}@Overridepublic void moveDown() {System.out.println("电梯正在下降");}@Overridepublic void stop() {System.out.println("电梯停止");elevator.setCurrentState(elevator.getStopState());}
}/*** @Description: 电梯* @Date: 2025-02-08 9:04* @Author: gaoyufei**/
public class Elevator {private ElevatorState closeState;private ElevatorState openState;private ElevatorState movingDownState;private ElevatorState movingUpState;private ElevatorState stopState;private ElevatorState currentState;public Elevator(){closeState=new CloseState(this);openState=new OpenState(this);movingDownState=new MovingDownState(this);movingUpState=new MovingUpState(this);stopState=new StopState(this);currentState=closeState;// 默认初始状态为关闭状态}public void setCurrentState(ElevatorState currentState) {this.currentState = currentState;}public ElevatorState getCloseState() {return closeState;}public ElevatorState getOpenState() {return openState;}public ElevatorState getMovingDownState() {return movingDownState;}public ElevatorState getMovingUpState() {return movingUpState;}public ElevatorState getStopState() {return stopState;}public void openDoor(){currentState.openDoor();}public void closeDoor(){currentState.closeDoor();}public void moveUp(){currentState.moveUp();}public void moveDown(){currentState.moveDown();}public void stop(){currentState.stop();}
}/*** @Description: 客户端* @Date: 2025-02-08 9:29* @Author: gaoyufei**/
public class Client {public static void main(String[] args) {//初始关闭状态Elevator elevator=new Elevator();//关门elevator.closeDoor();//输出 电梯门已经关了//开门elevator.openDoor();//输出 电梯门开了//上升elevator.moveUp();//输出 电梯门打开状态不能上升//关门elevator.closeDoor();//输出 电梯门关了//上升elevator.moveUp();//输出 电梯上升//关门elevator.closeDoor();//输出 电梯已经关门//下降elevator.moveDown();//输出 电梯下降//停止elevator.stop();//输出 电梯停止//开门elevator.openDoor();//输出 电梯门开了//停止elevator.stop();//输出 电梯门打开状态,不能变换为停止状态}
}