一、简介
1、定义
状态模式 (State Pattern)是一种行为型设计模式,允许对象在内部状态改变时改变它的行为。通过定义状态接口和具体状态类,将对象的状态和行为分开,使得状态改变时可以改变行为。
2、状态模式的结构
状态模式涉及以下几个角色:
State(状态接口):定义了状态类的共同接口,所有具体的状态类都实现这个接口。
ConcreteState(具体状态类):每个具体的状态类实现了State接口,并定义了在该状态下的具体行为。
Context(上下文):上下文类维护一个当前状态的引用,它通常会委托给具体的状态类来执行相应的状态切换。
二、Java实现案例
1、电灯开关状态案例
/**
* @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{
@Override
public 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{
@Override
public 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、番茄工作法状态案例
/**
* @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 {
@Override
public 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{
@Override
public 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、电梯状态案例
这是一个简单的电梯系统。电梯的状态有关门、开门、上升、下降、停止。每个状态下电梯的行为不同。通过状态模式,根据电梯的不同状态执行不同的行为。
/**
* @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;
}
@Override
public void openDoor() {
System.out.println("电梯门开了");
elevator.setCurrentState(elevator.getOpenState());
}
@Override
public void closeDoor() {
System.out.println("电梯门已经关了");
}
@Override
public void moveUp() {
System.out.println("电梯上升");
elevator.setCurrentState(elevator.getMovingUpState());
}
@Override
public void moveDown() {
System.out.println("电梯下降");
elevator.setCurrentState(elevator.getMovingDownState());
}
@Override
public 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;
}
@Override
public void openDoor() {
System.out.println("电梯门已经打开");
}
@Override
public void closeDoor() {
System.out.println("电梯门关了");
elevator.setCurrentState(elevator.getCloseState());
}
@Override
public void moveUp() {
System.out.println("电梯门打开状态,不能上升");
}
@Override
public void moveDown() {
System.out.println("电梯门打开状态,不能下降");
}
@Override
public 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;
}
@Override
public void openDoor() {
System.out.println("电梯门开了");
elevator.setCurrentState(elevator.getOpenState());
}
@Override
public void closeDoor() {
System.out.println("电梯门关了");
elevator.setCurrentState(elevator.getCloseState());
}
@Override
public void moveUp() {
System.out.println("电梯上升");
elevator.setCurrentState(elevator.getMovingUpState());
}
@Override
public void moveDown() {
System.out.println("电梯下降");
elevator.setCurrentState(elevator.getMovingDownState());
}
@Override
public 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;
}
@Override
public void openDoor() {
System.out.println("电梯正在上升,不能开门");
}
@Override
public void closeDoor() {
System.out.println("电梯已经关门");
}
@Override
public void moveUp() {
System.out.println("电梯正在上升");
}
@Override
public void moveDown() {
System.out.println("电梯下降");
elevator.setCurrentState(elevator.getMovingDownState());
}
@Override
public 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;
}
@Override
public void openDoor() {
System.out.println("电梯正在下降,不能开门");
}
@Override
public void closeDoor() {
System.out.println("电梯正在下降,已经关门了");
}
@Override
public void moveUp() {
System.out.println("电梯上升");
elevator.setCurrentState(elevator.getMovingUpState());
}
@Override
public void moveDown() {
System.out.println("电梯正在下降");
}
@Override
public 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();//输出 电梯门打开状态,不能变换为停止状态
}
}