23种设计模式-行为型模式之状态模式(Java版本)

Java 状态模式(State Pattern)详解

🧠 什么是状态模式?

状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,状态模式使得一个对象在其状态改变时会表现出不同的行为。通过将不同的状态封装成独立的类,并让对象根据状态来调用不同的类来实现状态的切换。


🎯 使用场景

  • 对象的行为依赖于它的状态,并且它必须在运行时根据状态改变它的行为
  • 需要有多个状态和状态之间的切换
  • 可以避免使用大量的 if-elseswitch 语句

🏗️ 模式结构

  • State(抽象状态类):定义一个接口,声明与状态相关的行为
  • ConcreteState(具体状态类):实现抽象状态类,定义具体的状态行为
  • Context(上下文) :维护一个 State 实例,负责在不同状态之间进行切换

✅ 示例:电梯的工作状态

抽象状态类

java 复制代码
public interface ElevatorState {
    void pressButton();
    void openDoor();
    void closeDoor();
    void move();
}

具体状态类

java 复制代码
public class MovingState implements ElevatorState {
    private Elevator elevator;

    public MovingState(Elevator elevator) {
        this.elevator = elevator;
    }

    @Override
    public void pressButton() {
        System.out.println("电梯正在移动,不能按按钮!");
    }

    @Override
    public void openDoor() {
        System.out.println("电梯正在移动,不能开门!");
    }

    @Override
    public void closeDoor() {
        System.out.println("电梯正在移动,门已经关闭!");
    }

    @Override
    public void move() {
        System.out.println("电梯正在移动...");
    }
}

public class IdleState implements ElevatorState {
    private Elevator elevator;

    public IdleState(Elevator elevator) {
        this.elevator = elevator;
    }

    @Override
    public void pressButton() {
        System.out.println("电梯停在楼层,开始移动...");
        elevator.setState(new MovingState(elevator));
    }

    @Override
    public void openDoor() {
        System.out.println("电梯开门...");
    }

    @Override
    public void closeDoor() {
        System.out.println("电梯门关闭...");
    }

    @Override
    public void move() {
        System.out.println("电梯停在当前楼层...");
    }
}

上下文类

java 复制代码
public class Elevator {
    private ElevatorState state;

    public Elevator() {
        this.state = new IdleState(this);  // 初始状态为待机状态
    }

    public void setState(ElevatorState state) {
        this.state = state;
    }

    public void pressButton() {
        state.pressButton();
    }

    public void openDoor() {
        state.openDoor();
    }

    public void closeDoor() {
        state.closeDoor();
    }

    public void move() {
        state.move();
    }
}

客户端

java 复制代码
public class Client {
    public static void main(String[] args) {
        Elevator elevator = new Elevator();

        elevator.pressButton();  // 输出:电梯停在楼层,开始移动...
        elevator.move();         // 输出:电梯正在移动...
        elevator.openDoor();     // 输出:电梯正在移动,不能开门!

        elevator.setState(new IdleState(elevator));  // 切换到待机状态
        elevator.openDoor();     // 输出:电梯开门...
    }
}

✅ 优点

  • 可以避免使用复杂的 if-else 语句或状态机
  • 易于添加新的状态和行为
  • 状态间的切换变得更加清晰和明确

⚠️ 缺点

  • 增加了类的数量
  • 状态模式的类设计可能显得较为繁琐

🧩 使用建议

状态模式适用于对象的行为依赖于其状态,并且状态之间有明确的转换关系的场景。典型应用包括工作流、状态机、电梯控制系统等。

相关推荐
L.EscaRC6 分钟前
Spring IOC核心原理与运用
java·spring·ioc
摇滚侠19 分钟前
2025最新 SpringCloud 教程,Nacos-总结,笔记19
java·笔记·spring cloud
在逃热干面23 分钟前
(笔记)获取终端输出保存到文件
java·笔记·spring
爱笑的眼睛1124 分钟前
深入理解MongoDB PyMongo API:从基础到高级实战
java·人工智能·python·ai
笃行客从不躺平34 分钟前
遇到大SQL怎么处理
java·开发语言·数据库·sql
q***876041 分钟前
Spring Boot 整合 Keycloak
java·spring boot·后端
Billow_lamb42 分钟前
Spring Boot2.x.x全局拦截器
java·spring boot·后端
上不如老下不如小1 小时前
2025年第七届全国高校计算机能力挑战赛初赛 Java组 编程题汇总
java·计算机能力挑战赛
泉城老铁1 小时前
Springboot对接mqtt
java·spring boot·后端
源码_V_saaskw1 小时前
JAVA国际版同城跑腿源码快递代取帮买帮送同城服务源码支持Android+IOS+H5
android·java·ios·微信小程序