MST

星途 面试题库

面试题:Java状态模式中状态类的职责是什么

在Java状态模式的应用场景下,请阐述状态类通常承担哪些职责?并举例说明如何通过状态类来实现对象不同状态下的行为变化。
43.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

状态类的职责

  1. 封装状态相关行为:每个状态类负责实现与该状态紧密相关的特定行为。例如在一个游戏角色的状态管理中,“奔跑”状态类实现角色奔跑时的动作逻辑,包括速度控制、动画切换等;“跳跃”状态类实现角色跳跃的行为,如跳跃高度计算、跳跃动画等。
  2. 管理状态转换:状态类可能会参与到状态转换的逻辑中。比如在电梯的状态管理里,“开门”状态类在执行开门动作完成后,可能负责将电梯状态转换到“等待”状态。
  3. 持有上下文引用:状态类通常持有对上下文对象(即拥有状态的对象)的引用,以便在需要时调用上下文的方法或修改上下文的属性。例如在一个自动售货机的状态管理中,“投币”状态类持有售货机上下文引用,在投币足够时可以调用上下文的方法来改变商品库存等。

实现对象不同状态下行为变化的示例

假设我们有一个手机,它有“开机”、“关机”和“待机”三种状态。

  1. 定义状态接口
public interface PhoneState {
    void handle(Phone phone);
}
  1. 实现具体状态类
    • 开机状态类
public class OnState implements PhoneState {
    @Override
    public void handle(Phone phone) {
        System.out.println("手机处于开机状态,可以进行操作");
        // 可以在这里实现开机状态下的具体操作逻辑,如显示主界面等
    }
}
- **关机状态类**:
public class OffState implements PhoneState {
    @Override
    public void handle(Phone phone) {
        System.out.println("手机处于关机状态,无法操作");
        // 可以实现关机状态下的一些逻辑,如保存关机前数据等
    }
}
- **待机状态类**:
public class StandbyState implements PhoneState {
    @Override
    public void handle(Phone phone) {
        System.out.println("手机处于待机状态,等待操作");
        // 实现待机状态下的逻辑,如检测是否有来电等
    }
}
  1. 定义上下文类(手机类)
public class Phone {
    private PhoneState state;

    public Phone() {
        this.state = new OffState();
    }

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

    public void request() {
        state.handle(this);
    }
}
  1. 测试代码
public class Main {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.request(); // 输出:手机处于关机状态,无法操作

        phone.setState(new OnState());
        phone.request(); // 输出:手机处于开机状态,可以进行操作

        phone.setState(new StandbyState());
        phone.request(); // 输出:手机处于待机状态,等待操作
    }
}

通过上述代码,手机对象根据不同的状态类实现了不同状态下的行为变化。