行为型模式 - 状态模式 (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();
    }
}
相关推荐
短剑重铸之日11 小时前
《设计模式》第六篇:装饰器模式
java·后端·设计模式·装饰器模式
茶本无香13 小时前
设计模式之十二:模板方法模式Spring应用与Java示例详解
java·设计模式·模板方法模式
wangmengxxw19 小时前
设计模式 -详解
开发语言·javascript·设计模式
进击的小头20 小时前
设计模式落地的避坑指南(C语言版)
c语言·开发语言·设计模式
短剑重铸之日20 小时前
《设计模式》第五篇:策略模式
java·后端·设计模式·策略模式
前端不太难20 小时前
HarmonyOS 为何用 Ability 约束游戏?
游戏·状态模式·harmonyos
新缸中之脑21 小时前
5个AI设计的音乐 UI 比较
人工智能·ui·状态模式
HL_风神21 小时前
C++设计模式学习-工厂方法模式
c++·学习·设计模式
前端不太难21 小时前
游戏在 HarmonyOS 上如何“活”?
游戏·状态模式·harmonyos
琹箐21 小时前
设计模式——策略模式
设计模式·策略模式