MST

星途 面试题库

面试题:Go接口设计模式下的状态模式优化

假设我们有一个游戏角色,其有不同的状态(如Idle、Running、Jumping等),现在已经使用接口设计模式实现了状态模式。要求在原有的基础上,优化代码以支持状态之间更加复杂的转换逻辑,例如在Running状态下受到攻击后进入Dizzy状态,Dizzy状态持续一段时间后回到Idle状态,同时要考虑代码的可维护性和扩展性,描述你的优化思路并写出相关代码。
18.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. 引入状态机概念:使用状态机来管理状态之间的转换逻辑,将每个状态看作是状态机的一个节点,状态转换看作是节点之间的边。这样可以清晰地描述和管理复杂的状态转换关系。
  2. 抽象状态类:将通用的状态行为抽象到一个基类中,每个具体状态类继承自该基类。这样可以减少代码重复,提高可维护性。
  3. 事件驱动:通过事件来触发状态转换,例如受到攻击事件、时间流逝事件等。这样可以使状态转换逻辑更加清晰和可扩展。

代码示例

以下以Java代码为例:

  1. 定义状态接口
public interface CharacterState {
    void enter();
    void execute();
    void exit();
}
  1. 抽象状态类
public abstract class AbstractCharacterState implements CharacterState {
    protected Character character;

    public AbstractCharacterState(Character character) {
        this.character = character;
    }

    @Override
    public void enter() {
        // 通用的进入状态逻辑
    }

    @Override
    public void exit() {
        // 通用的离开状态逻辑
    }
}
  1. 具体状态类
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状态");
        }
    }
}
  1. 角色类
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();
        }
    }
}
  1. 测试代码
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();
    }
}

上述代码通过引入状态机概念、抽象状态类和事件驱动的方式,优化了状态模式,使其能够支持更加复杂的状态转换逻辑,同时保证了代码的可维护性和扩展性。