Elevator System
Problem Statement
Section titled “Problem Statement”Design an elevator control system for a building with multiple elevators. The system should efficiently handle user requests from different floors, optimize elevator movement to reduce wait times, and manage elevator states. Support both internal (inside elevator) and external (floor) requests.
Requirements
Section titled “Requirements”Functional Requirements
Section titled “Functional Requirements”- Handle multiple elevators in a building
- Process requests from floors (up/down buttons)
- Process requests from inside elevator (floor selection)
- Optimal elevator selection based on proximity and direction
- Support different elevator states: IDLE, MOVING_UP, MOVING_DOWN, MAINTENANCE
- Door open/close operations with safety checks
- Emergency stop functionality
- Maximum capacity enforcement
Non-Functional Requirements
Section titled “Non-Functional Requirements”- Minimize average wait time
- Thread-safe for concurrent requests
- Efficient scheduling algorithm
- Real-time status updates
- Fault-tolerant system
Simplified Class Diagram
Section titled “Simplified Class Diagram”Simplified Overview
Section titled “Simplified Overview”Detailed Class Diagram
Section titled “Detailed Class Diagram”Key Design Patterns
Section titled “Key Design Patterns”- Singleton Pattern: ElevatorSystem as single control point
- Strategy Pattern: Different elevator selection algorithms
- State Pattern: Elevator and door state management
- Observer Pattern: Display updates when elevator moves
Design Pattern Diagrams
Section titled “Design Pattern Diagrams”1. Strategy Pattern - Elevator Selection Algorithm
Section titled “1. Strategy Pattern - Elevator Selection Algorithm”2. State Pattern - Elevator State Management
Section titled “2. State Pattern - Elevator State Management”3. Observer Pattern - Display Updates
Section titled “3. Observer Pattern - Display Updates”Code Snippets
Section titled “Code Snippets”Elevator Movement Logic
Section titled “Elevator Movement Logic”public class ElevatorCar { public void move() { if (requests.isEmpty()) { state = ElevatorState.IDLE; return; }
int targetFloor = requests.peek();
if (currentFloor < targetFloor) { state = ElevatorState.MOVING_UP; currentFloor++; } else if (currentFloor > targetFloor) { state = ElevatorState.MOVING_DOWN; currentFloor--; } else { // Reached target floor requests.poll(); openDoor(); // Wait for passengers closeDoor(); }
display.update(currentFloor, getDirection()); }
public boolean isMovingTowards(int floor, Direction direction) { if (state == ElevatorState.IDLE) { return true; }
if (direction == Direction.UP) { return state == ElevatorState.MOVING_UP && currentFloor < floor; } else { return state == ElevatorState.MOVING_DOWN && currentFloor > floor; } }}Elevator Selection Strategy
Section titled “Elevator Selection Strategy”public class NearestElevatorStrategy implements ElevatorSelectionStrategy { @Override public ElevatorCar selectElevator(List<ElevatorCar> elevators, Request request) { ElevatorCar bestElevator = null; int minDistance = Integer.MAX_VALUE;
for (ElevatorCar elevator : elevators) { if (!elevator.hasCapacity()) { continue; }
// Prefer elevators already moving in the same direction if (elevator.isMovingTowards(request.getSourceFloor(), request.getDirection())) { int distance = Math.abs(elevator.getCurrentFloor() - request.getSourceFloor()); if (distance < minDistance) { minDistance = distance; bestElevator = elevator; } } }
// If no suitable elevator found, select nearest idle elevator if (bestElevator == null) { for (ElevatorCar elevator : elevators) { if (elevator.getState() == ElevatorState.IDLE) { int distance = Math.abs(elevator.getCurrentFloor() - request.getSourceFloor()); if (distance < minDistance) { minDistance = distance; bestElevator = elevator; } } } }
return bestElevator; }}Request Processing
Section titled “Request Processing”public class ElevatorSystem { public void requestElevator(int floor, Direction direction) { Request request = new Request(floor, -1); request.setDirection(direction);
ElevatorCar selectedElevator = selectionStrategy.selectElevator(elevators, request);
if (selectedElevator != null) { selectedElevator.addRequest(floor); logger.info("Assigned elevator " + selectedElevator.getId() + " to floor " + floor); } else { logger.warning("No available elevator for floor " + floor); } }}Extension Points
Section titled “Extension Points”- Add predictive algorithms for peak hours
- Implement energy-saving mode during low usage
- Add priority handling for VIP floors
- Support express elevators (skip certain floors)
- Implement load balancing across elevators
- Add destination dispatch system (group passengers by destination)
- Include elevator maintenance scheduling