行为型模式 - 状态模式 (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 小时前
工厂模式详解
设计模式
Charles_go12 小时前
C#42、什么是建造者设计模式
设计模式
烤麻辣烫15 小时前
23种设计模式(新手)-3接口隔离原则
java·开发语言·学习·设计模式·intellij-idea
e***U82016 小时前
算法设计模式
算法·设计模式
颜酱17 小时前
理解编程的设计模式(前端角度)
设计模式
ZHE|张恒18 小时前
设计模式(五)原型模式 — 通过克隆快速复制对象,避免复杂初始化
设计模式·原型模式
敖云岚1 天前
【设计模式】简单易懂的行为型设计模式-策略模式
设计模式·策略模式
IT永勇2 天前
C++设计模式-单例
c++·单例模式·设计模式
shuxiaohua2 天前
使用HttpURLConnection调用SSE采坑记录
状态模式
ZHE|张恒2 天前
设计模式(四)建造者模式 — 分步骤构建复杂对象,让创建过程可控可扩展
设计模式·建造者模式