行为型模式 - 状态模式 (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();
    }
}
相关推荐
仪***沿15 小时前
Fluent中颗粒流模拟的门道
状态模式
GDAL16 小时前
前端保存用户登录信息 深入全面讲解
前端·状态模式
平凡之路无尽路21 小时前
智能体设计模式:构建智能系统的实践指南
人工智能·设计模式·自然语言处理·nlp·aigc·vllm
柯南二号1 天前
【大前端】【Android】把 Activity 重构成 MVVM 的对比示例
android·状态模式
冷崖1 天前
工厂模式-创建型
c++·设计模式
何中应2 天前
【面试题-5】设计模式
java·开发语言·后端·设计模式·面试题
沐森2 天前
在实战中运用泛型和动态trait(特质)
设计模式
lomocode2 天前
改一个需求动 23 处代码?你可能踩进了这个坑
后端·设计模式
喷火龙8号2 天前
JWT 认证方案深度对比:单 Token 扩展刷新 vs 双 Token 验证
后端·设计模式·架构
William_cl2 天前
【CSDN 专栏】C# ASP.NET控制器过滤器:自定义 ActionFilterAttribute 实战(避坑 + 图解)
c#·asp.net·状态模式