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 语句或状态机
  • 易于添加新的状态和行为
  • 状态间的切换变得更加清晰和明确

⚠️ 缺点

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

🧩 使用建议

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

相关推荐
小bo波1 小时前
使用Thread子类创建线程 VS 使用Runnable接口创建线程的区别
java·多线程·thread·并发编程·runnable
SamDeepThinking2 小时前
高并发场景下,CompletableFuture与ForkJoinPool该如何取舍?
java·后端·面试
张不才5 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
shepherd1116 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
plainGeekDev9 小时前
单例模式 → object 声明
android·java·kotlin
用户2986985301410 小时前
Java 实现 Word 文档文本与图片提取的方法
java·后端
SimonKing10 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
咖啡八杯21 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
用户128526116021 天前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java