Skip to content

面试速答(先看这里)

**一句话结论:**状态模式允许一个对象在其内部状态发生改变时改变它的行为,使其看起来像是修改了其类。

60秒标准回答:

状态模式允许一个对象在其内部状态发生改变时改变它的行为,使其看起来像是修改了其类。 它通过将对象的行为包装在不同状态对象中,实现了在运行时更改对象的状态,从而影响其行为

状态模式也有很多实际的应用场景,如

在实际应用中,状态模式通常需要和其他设计模式结合使用,例如工厂模式、单例模式、策略模式等,以实现更灵活和高效的代码设计

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**状态模式也有很多实际的应用场景,如:
  • **要点2:**在实际应用中,状态模式通常需要和其他设计模式结合使用,例如工厂模式、单例模式、策略模式等,以实现更灵活和高效的代码设计。
  • **要点3:**假设我们正在为一个订单系统,需要管理他的状态,比如它包含了已创建、已支付、已发货、已完成、已取消等状态。
  • **要点4:**然后定义具体的状态类,为每个具体状态实现上述接口。
  • **要点5:**最后定义一个Order类,持有一个状态对象的引用,通过该状态对象的方法实现状态的切换。

**记忆锚点:**Order → 状态模式 → previousStep → 为包装在不同状态对象 → 现了在运行时更改对象 → 首先定义一个状态接口

加分表达:

  • 状态模式也有很多实际的应用场景,如: 订单状态管理:订单状态有很多种,如未付款、已付款、已发货、已签收等。

追问准备:

  • 围绕「Order」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「状态模式」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「previousStep」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

**状态模式允许一个对象在其内部状态发生改变时改变它的行为,使其看起来像是修改了其类。**它通过将对象的行为包装在不同状态对象中,实现了在运行时更改对象的状态,从而影响其行为。

状态模式也有很多实际的应用场景,如:

  1. 订单状态管理:订单状态有很多种,如未付款、已付款、已发货、已签收等。不同状态下,订单的行为也不同。
  2. 游戏角色状态:游戏角色的状态有很多种,如待机、行走、攻击、受伤等。不同状态下,角色的行为也不同。
  3. 音视频播放器:音视频播放器的状态有很多种,如播放、暂停、停止、快进、快退等。不同状态下,播放器的行为也不同。

在实际应用中,状态模式通常需要和其他设计模式结合使用,例如工厂模式、单例模式、策略模式等,以实现更灵活和高效的代码设计。

扩展知识 ​

示例 ​

假设我们正在为一个订单系统,需要管理他的状态,比如它包含了已创建、已支付、已发货、已完成、已取消等状态。

首先定义一个状态接口

plain
public interface OrderState {
    void next(Order order);
    void previous(Order order);
    void printStatus();
}

然后定义具体的状态类,为每个具体状态实现上述接口。这里以两个状态为例:已创建和已支付。

plain
public class CreatedState implements OrderState {
    @Override
    public void next(Order order) {
        order.setState(new PaidState());
    }

    @Override
    public void previous(Order order) {
        System.out.println("The order is in its root state.");
    }

    @Override
    public void printStatus() {
        System.out.println("Order created.");
    }
}

public class PaidState implements OrderState {
    @Override
    public void next(Order order) {
        order.setState(new ShippedState());
    }

    @Override
    public void previous(Order order) {
        order.setState(new CreatedState());
    }

    @Override
    public void printStatus() {
        System.out.println("Order paid.");
    }
}

最后定义一个Order类,持有一个状态对象的引用,通过该状态对象的方法实现状态的切换。

plain
public class Order {
    private OrderState state;

    public Order() {
        // 订单初始化状态为已创建
        this.state = new CreatedState();
    }

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

    public OrderState getState() {
        return this.state;
    }

    public void nextStep() {
        state.next(this);
    }

    public void previousStep() {
        state.previous(this);
    }

    public void printStatus() {
        state.printStatus();
    }
}

使用示例如下:

java
public class StatePatternDemo {
    public static void main(String[] args) {
        Order order = new Order();

        order.printStatus();  

        order.nextStep();
        order.printStatus();  

        order.nextStep();
        order.printStatus();  
    }
}

在这个例子中,Order对象根据其内部状态的改变(通过调用nextStep或previousStep方法)表现出了不同的行为。这就是状态模式的精髓:它将对象在不同状态下的行为封装到不同的状态对象中,使得状态的转换逻辑清晰,且易于扩展。