行为型模式 - 状态模式 (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 小时前
设计模式之中介者模式
设计模式·中介者模式
Cuit小唐19 小时前
C++ 状态模式详解
开发语言·c++·状态模式
yangyang_z1 天前
【C++设计模式之Template Method Pattern】
设计模式
源远流长jerry1 天前
常用设计模式
设计模式
z26373056111 天前
六大设计模式--OCP(开闭原则):构建可扩展软件的基石
设计模式·开闭原则
01空间2 天前
设计模式简述(十八)享元模式
设计模式·享元模式
秋名RG2 天前
深入理解设计模式之原型模式(Prototype Pattern)
设计模式·原型模式
Li小李同学Li2 天前
设计模式【cpp实现版本】
单例模式·设计模式
周努力.2 天前
设计模式之状态模式
设计模式·状态模式
268572593 天前
Java 23种设计模式 - 行为型模式11种
java·开发语言·设计模式