行为型模式 - 状态模式 (State Pattern)

行为型模式 - 状态模式 (State Pattern)

状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。下面为你介绍几个状态模式的经典案例。


java 复制代码
// 抽象状态类
abstract class LiftState {
    protected Lift lift;

    public LiftState(Lift lift) {
        this.lift = lift;
    }

    public abstract void open();
    public abstract void close();
    public abstract void run();
    public abstract void stop();
}

// 电梯类
class Lift {
    private LiftState currentState;

    public Lift() {
        // 初始状态为关门状态
        this.currentState = new ClosedState(this);
    }

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

    public void open() {
        currentState.open();
    }

    public void close() {
        currentState.close();
    }

    public void run() {
        currentState.run();
    }

    public void stop() {
        currentState.stop();
    }
}

// 开门状态类
class OpenState extends LiftState {
    public OpenState(Lift lift) {
        super(lift);
    }

    @Override
    public void open() {
        System.out.println("电梯已经开门,无需重复操作");
    }

    @Override
    public void close() {
        System.out.println("电梯门关闭");
        lift.setState(new ClosedState(lift));
    }

    @Override
    public void run() {
        System.out.println("电梯门未关闭,不能运行");
    }

    @Override
    public void stop() {
        System.out.println("电梯处于开门状态,已经停止");
    }
}

// 关门状态类
class ClosedState extends LiftState {
    public ClosedState(Lift lift) {
        super(lift);
    }

    @Override
    public void open() {
        System.out.println("电梯门打开");
        lift.setState(new OpenState(lift));
    }

    @Override
    public void close() {
        System.out.println("电梯门已经关闭,无需重复操作");
    }

    @Override
    public void run() {
        System.out.println("电梯开始运行");
        lift.setState(new RunningState(lift));
    }

    @Override
    public void stop() {
        System.out.println("电梯已经停止,处于关门状态");
    }
}

// 运行状态类
class RunningState extends LiftState {
    public RunningState(Lift lift) {
        super(lift);
    }

    @Override
    public void open() {
        System.out.println("电梯正在运行,不能开门");
    }

    @Override
    public void close() {
        System.out.println("电梯正在运行,门已经关闭");
    }

    @Override
    public void run() {
        System.out.println("电梯正在运行,无需重复操作");
    }

    @Override
    public void stop() {
        System.out.println("电梯停止运行");
        lift.setState(new StoppedState(lift));
    }
}

// 停止状态类
class StoppedState extends LiftState {
    public StoppedState(Lift lift) {
        super(lift);
    }

    @Override
    public void open() {
        System.out.println("电梯门打开");
        lift.setState(new OpenState(lift));
    }

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

    @Override
    public void run() {
        System.out.println("电梯开始运行");
        lift.setState(new RunningState(lift));
    }

    @Override
    public void stop() {
        System.out.println("电梯已经停止,无需重复操作");
    }
}

// 客户端代码
public class LiftSystem {
    public static void main(String[] args) {
        Lift lift = new Lift();

        // 开门
        lift.open();
        // 尝试运行(开门状态下不能运行)
        lift.run();
        // 关门
        lift.close();
        // 运行
        lift.run();
        // 停止
        lift.stop();
        // 开门
        lift.open();
    }
}
相关推荐
Kel20 小时前
MCP 传输链路全链路拆解:从字节流到协议栈的四层架构之旅
人工智能·设计模式·架构
chase_my_dream1 天前
FAST-LIO src/IMU_Processing.hpp 完整详细讲解
c++·状态模式·slam
atunet1 天前
关于算法设计模式的演化与编程范式变迁的技术7
算法·设计模式
geovindu1 天前
go:Timing Functions Pattern
开发语言·后端·设计模式·golang·计时函数模式·性能分析模式
咖啡八杯3 天前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
槑有老呆3 天前
从 Prompt Engineering 到 Harness Engineering:AI 编程的下一次跃迁
设计模式
HjhIron3 天前
从Prompt到Context:大模型应用开发的范式转移
设计模式·aigc·ai编程
咖啡八杯5 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
前端不太难5 天前
Tool Graph:HarmonyOS PC 如何统一所有系统能力?
华为·状态模式·harmonyos
胡萝卜术5 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试