面试题答案
一键面试Kotlin 实现状态模式的游戏角色状态机
- 定义状态接口
interface CharacterState {
fun enter(character: GameCharacter)
fun execute(character: GameCharacter)
fun exit(character: GameCharacter)
}
- 定义具体状态类
class StandingState : CharacterState {
override fun enter(character: GameCharacter) {
println("角色进入站立状态")
}
override fun execute(character: GameCharacter) {
println("角色正在站立")
}
override fun exit(character: GameCharacter) {
println("角色离开站立状态")
}
}
class RunningState : CharacterState {
override fun enter(character: GameCharacter) {
println("角色进入奔跑状态")
}
override fun execute(character: GameCharacter) {
println("角色正在奔跑")
}
override fun exit(character: GameCharacter) {
println("角色离开奔跑状态")
}
}
class JumpingState : CharacterState {
override fun enter(character: GameCharacter) {
println("角色进入跳跃状态")
}
override fun execute(character: GameCharacter) {
println("角色正在跳跃")
}
override fun exit(character: GameCharacter) {
println("角色离开跳跃状态")
}
}
- 定义游戏角色类
class GameCharacter {
private var currentState: CharacterState? = null
fun setState(state: CharacterState) {
currentState?.exit(this)
currentState = state
currentState?.enter(this)
}
fun executeState() {
currentState?.execute(this)
}
}
- 测试代码
fun main() {
val character = GameCharacter()
character.setState(StandingState())
character.executeState()
character.setState(RunningState())
character.executeState()
character.setState(JumpingState())
character.executeState()
}
性能优化
- 对象复用:对于一些无状态或者状态信息不依赖外部变化的具体状态类,可以使用单例模式进行复用,减少对象创建开销。例如,
StandingState
、RunningState
和JumpingState
如果没有成员变量,可以改为单例。
object StandingState : CharacterState {
// 实现方法
}
- 减少状态切换开销:在状态切换时,可以提前缓存一些状态切换的必要信息,避免每次切换都进行重复计算。例如,记录从某个状态切换到另一个状态的过渡动画等相关信息。
代码结构优化
- 分层架构:可以将状态相关的逻辑进一步分层,比如将状态接口和具体状态类放在一个单独的包中,游戏角色类放在另一个包中,使代码结构更加清晰,便于维护和扩展。
- 使用枚举类进行状态标识:如果状态数量有限且明确,可以使用枚举类来标识状态,在状态切换时可以通过枚举值来判断,代码可读性更好。
enum class CharacterStatus {
STANDING, RUNNING, JUMPING
}
然后在 GameCharacter
类中可以通过枚举值来控制状态切换逻辑。
3. 添加日志和调试信息:在状态的 enter
、execute
和 exit
方法中添加详细的日志信息,方便调试和追踪状态机的运行情况。可以使用 Kotlin 内置的日志库或者第三方日志库,如 log4j
等。