面试题答案
一键面试状态类的职责
- 封装状态相关行为:每个状态类负责实现与该状态紧密相关的特定行为。例如在一个游戏角色的状态管理中,“奔跑”状态类实现角色奔跑时的动作逻辑,包括速度控制、动画切换等;“跳跃”状态类实现角色跳跃的行为,如跳跃高度计算、跳跃动画等。
- 管理状态转换:状态类可能会参与到状态转换的逻辑中。比如在电梯的状态管理里,“开门”状态类在执行开门动作完成后,可能负责将电梯状态转换到“等待”状态。
- 持有上下文引用:状态类通常持有对上下文对象(即拥有状态的对象)的引用,以便在需要时调用上下文的方法或修改上下文的属性。例如在一个自动售货机的状态管理中,“投币”状态类持有售货机上下文引用,在投币足够时可以调用上下文的方法来改变商品库存等。
实现对象不同状态下行为变化的示例
假设我们有一个手机,它有“开机”、“关机”和“待机”三种状态。
- 定义状态接口:
public interface PhoneState {
void handle(Phone phone);
}
- 实现具体状态类:
- 开机状态类:
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("手机处于待机状态,等待操作");
// 实现待机状态下的逻辑,如检测是否有来电等
}
}
- 定义上下文类(手机类):
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);
}
}
- 测试代码:
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(); // 输出:手机处于待机状态,等待操作
}
}
通过上述代码,手机对象根据不同的状态类实现了不同状态下的行为变化。