面试题答案
一键面试优化思路
- 引入状态机概念:使用状态机来管理状态之间的转换逻辑,将每个状态看作是状态机的一个节点,状态转换看作是节点之间的边。这样可以清晰地描述和管理复杂的状态转换关系。
- 抽象状态类:将通用的状态行为抽象到一个基类中,每个具体状态类继承自该基类。这样可以减少代码重复,提高可维护性。
- 事件驱动:通过事件来触发状态转换,例如受到攻击事件、时间流逝事件等。这样可以使状态转换逻辑更加清晰和可扩展。
代码示例
以下以Java代码为例:
- 定义状态接口
public interface CharacterState {
void enter();
void execute();
void exit();
}
- 抽象状态类
public abstract class AbstractCharacterState implements CharacterState {
protected Character character;
public AbstractCharacterState(Character character) {
this.character = character;
}
@Override
public void enter() {
// 通用的进入状态逻辑
}
@Override
public void exit() {
// 通用的离开状态逻辑
}
}
- 具体状态类
public class IdleState extends AbstractCharacterState {
public IdleState(Character character) {
super(character);
}
@Override
public void execute() {
System.out.println("角色处于Idle状态");
}
}
public class RunningState extends AbstractCharacterState {
public RunningState(Character character) {
super(character);
}
@Override
public void execute() {
System.out.println("角色处于Running状态");
}
public void onAttacked() {
character.changeState(new DizzyState(character));
}
}
public class DizzyState extends AbstractCharacterState {
private long startTime;
private long duration = 3000; // 眩晕持续3秒
public DizzyState(Character character) {
super(character);
this.startTime = System.currentTimeMillis();
}
@Override
public void execute() {
long currentTime = System.currentTimeMillis();
if (currentTime - startTime >= duration) {
character.changeState(new IdleState(character));
} else {
System.out.println("角色处于Dizzy状态");
}
}
}
- 角色类
public class Character {
private CharacterState currentState;
public Character() {
this.currentState = new IdleState(this);
}
public void changeState(CharacterState newState) {
currentState.exit();
currentState = newState;
currentState.enter();
}
public void performAction() {
currentState.execute();
}
public void attack() {
if (currentState instanceof RunningState) {
((RunningState) currentState).onAttacked();
}
}
}
- 测试代码
public class Main {
public static void main(String[] args) {
Character character = new Character();
character.performAction();
// 模拟角色跑步
character.changeState(new RunningState(character));
character.performAction();
// 模拟角色受到攻击
character.attack();
character.performAction();
// 等待一段时间,让眩晕状态结束
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
character.performAction();
}
}
上述代码通过引入状态机概念、抽象状态类和事件驱动的方式,优化了状态模式,使其能够支持更加复杂的状态转换逻辑,同时保证了代码的可维护性和扩展性。