Skip to main content

Elevator System — Low Level Design

Problem Statement

Design a low-level elevator system that manages multiple elevators across a multi-floor building, handling passenger requests efficiently.

Diagram

Elevator System Design


Requirements

Functional

  • Passengers can press a button on any floor (UP / DOWN) to request an elevator
  • Passengers can select a destination floor inside the elevator
  • Elevator moves to requested floors and opens/closes doors
  • System dispatches the most appropriate elevator per request
  • Elevator respects floor limits (min/max floor)

Non-Functional

  • Responsive: elevator dispatched within seconds
  • Extensible: pluggable dispatch strategy (SCAN, LOOK, nearest)
  • Thread-safe: concurrent requests from multiple floors/passengers

Core Entities

Enums

enum Direction {
UP,
DOWN,
IDLE,
}
enum DoorState {
OPEN,
CLOSED,
}
enum ElevatorState {
MOVING,
IDLE,
STOPPED,
}

Floor

class Floor {
floorNumber: number;
upButton: boolean; // external request panel
downButton: boolean;
}

ElevatorCar

class ElevatorCar {
id: string;
currentFloor: number;
direction: Direction;
state: ElevatorState;
doorState: DoorState;
destinationQueue: Set<number>; // internal button presses

move(): void; // advance one floor toward next destination
openDoor(): void;
closeDoor(): void;
addDestination(floor: number): void;
hasDestination(): boolean;
}

ElevatorController (Dispatcher)

class ElevatorController {
elevators: ElevatorCar[];
strategy: DispatchStrategy;

requestElevator(floor: number, direction: Direction): void;
selectFloor(elevatorId: string, floor: number): void;
tick(): void; // advance simulation one step
}

DispatchStrategy (Interface)

interface DispatchStrategy {
assign(request: Request, elevators: ElevatorCar[]): ElevatorCar;
}

Dispatch Strategies

Nearest Idle

Assign the elevator that is idle and closest to the requested floor.

cost(elevator) = |elevator.currentFloor - requestedFloor|
pick: min(cost) where state === IDLE

SCAN (Elevator Algorithm)

Elevator sweeps in one direction, picks up all requests, then reverses.

If elevator moving UP → serve all floors above current first
If elevator moving DOWN → serve all floors below current first

LOOK (Optimized SCAN)

Same as SCAN but reverses direction when no more requests exist in current direction — avoids unnecessary travel to extremes.


Class Diagram


Request Flow


State Machine — Elevator


Edge Cases & Discussion Points

ScenarioHandling
Two passengers request same floorOnly one elevator dispatched; first confirmed wins
Elevator at max floor, UP pressedIgnore UP, elevator switches direction DOWN
Elevator full (weight sensor)Skip floor assignment; dispatch next available elevator
Power outageElevator moves to nearest safe floor and opens door
Multiple elevators same distancePrefer the one already moving in the same direction
Door obstructionRetry close after timeout; raise alert after N retries

Trade-offs

DecisionOption AOption B
Queue typeMin-heap (priority)Sorted set
DispatchCentralized controllerEach elevator self-manages
ThreadingSingle event loop (tick)Per-elevator thread
StrategyHardcoded SCANStrategy pattern (pluggable)

Recommended: Centralized controller + Strategy pattern + priority queue per elevator.


Follow-up Questions

  • How would you handle a 100-floor skyscraper with 20 elevators? (zone partitioning)
  • How do you ensure thread safety when multiple requests arrive simultaneously?
  • How would you add VIP floors or express elevators?
  • How do you optimize for peak hour traffic (morning lobby rush)?