@startuml
package com.iluwatar.gameloop {
  class App {
    - GAME_LOOP_DURATION_TIME : int {static}
    - LOGGER : Logger {static}
    + App()
    + main(args : String[]) {static}
  }
  class Bullet {
    - position : float
    + Bullet()
    + getPosition() : float
    + setPosition(position : float)
  }
  class FixedStepGameLoop {
    - MS_PER_FRAME : long {static}
    + FixedStepGameLoop()
    # processGameLoop()
    # update()
  }
  class FrameBasedGameLoop {
    + FrameBasedGameLoop()
    # processGameLoop()
    # update()
  }
  class GameController {
    # bullet : Bullet
    + GameController()
    + getBulletPosition() : float
    + moveBullet(offset : float)
  }
  abstract class GameLoop {
    # controller : GameController
    - gameThread : Thread
    # logger : Logger
    # status : GameStatus
    + GameLoop()
    + isGameRunning() : boolean
    # processGameLoop() {abstract}
    # processInput()
    # render()
    + run()
    + stop()
  }
  enum GameStatus {
    + RUNNING {static}
    + STOPPED {static}
    + valueOf(name : String) : GameStatus {static}
    + values() : GameStatus[] {static}
  }
  class VariableStepGameLoop {
    + VariableStepGameLoop()
    # processGameLoop()
    # update(elapsedTime : Long)
  }
}
GameLoop -->  "-status" GameStatus
GameController -->  "-bullet" Bullet
GameLoop -->  "-controller" GameController
FixedStepGameLoop --|> GameLoop 
FrameBasedGameLoop --|> GameLoop 
VariableStepGameLoop --|> GameLoop 
@enduml