educative.io

Using state design pattern

i am trying to implment this using state design pattern please correct this i think i am missing or doing something wrong :::::::::::::::::::::class Elevator{

IElevatorState elevatorState;

IDoorState doorState;

List listOfMovingUpRequestedFloor;

List listOfMovingDownRequestedFloor;

int cuurent_floor;

public Elevator(){
this.listOfMovingDownRequestedFloor = new ArrayList<>();
this.listOfMovingUpRequestedFloor = new ArrayList<>();
this.cuurent_floor = 0;
this.elevatorState = new elevatorIdleState(this);
}

handlerequest(int floorNo){
elevatorState.handle(request);
};

handleDoorRequest(int floorNo){

  doorState.handleDoorRequest(floorNo);

}

public void changeState(IElevatorState elevatorState){
this.elevatorState = elevatorState;
}

public void addFloorToMovingUpList(int floor){
this.listOfMovingUpRequestedFloor.add(floorNo);
}

public void addFloorToMovingDown(int floor){
this.listOfMovingDownRequestedFloor.add(floorNo);
}

public void changeDoorState(){

}

}

interface IElevatorState{

handlerequest(int floor);

}

interface IDoorState{
handleDoorRequest();
}

class openDoorState extends IDoorState{

 public void closeDoorWithDelay() {
    try {
        Thread.sleep(20000); // 20 seconds delay
        changeDoorState(new closedDoorState(elevator));
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

 handleDoorRequest(){
    if(listOfMovingUpRequestedFloor.get(floorNo).isNotEmpty()&& is not equal to current floor){
       
       changeDoorStateToOClose();
       //and move the lift 

    }
    else {
        changeState(new elevatorIdleState(elevator));
    }
 }

}

class closedDoorState extends IDoorState{

handleDoorRequest(){
if(listOfMovingUpRequestedFloor.get(floorNo).isPresent() || listOfMovingDownRequestedFloor.get(floorNo).isPresent() ){
changeDoorState(new openDoorState(Elevator elevator));
if(listOfMovingDownRequestedFloor.remove(floorNo)){

        }
    }
    else {
        // remain closed and move in the same direction
    }
 }

}

class elevatorIdleState extends IElevatorState{

Elevator elevator;

public elevatorIdleState(Elevator elevator){
    this.elevator=elevator;
 }


handlerequest(int floor){

    int elevatorNo = Elevator.getcuurent();
    
    if(elevatorNo>floor){
        this.listOfMovingUpRequestedFloor.add(floor);
        elevator.changeState(new elevatorMovingUpElevator(this.elevator));
    }
    else {
        this.listOfMovingDownRequestedFloor.add(floor);
        elevator.changeState(new elevatorMovingDownElevator(this.elevator));
    }
 }

}

class elevatorMovingUpElevator extends IElevatorState{

Elevator elevator;

public elevatorIdleState(Elevator elevator){
    this.elevator=elevator;
 }

handlerequest(int floor){

    int elevatorNo = Elevator.getcuurent();
    
    if(elevatorNo>floor){
        this.listOfMovingUpRequestedFloor.add(floor);
    }
    else {
        this.listOfMovingDownRequestedFloor.add(floor);
    }
}

}

class elevatorMovingDownElevator extends IElevatorState{

Elevator elevator;

public elevatorIdleState(Elevator elevator){
    this.elevator=elevator;
 }
 
 
 handlerequest(int floor){
    int elevatorNo = Elevator.getcuurent();
    
    if(elevatorNo>floor){
        this.listOfMovingUpRequestedFloor.add(floor);
    }
    else {
        this.listOfMovingDownRequestedFloor.add(floor);
    }
}

}

class Display{

int floorNo;
int capacity;

// moving up or down 
Direction direction;

public void display();

// this is like setter method whenever the person eneter the 
// the elevator will update the direction , capacity and floorno and alll.......
public void update();

}


Course: https://www.educative.io/courses/grokking-the-low-level-design-interview-using-ood-principles
Lesson: Class Diagram for the Elevator System

Hello @Sahil_Siddiqui,

Here’s a simplified and fixed version of your code:

import java.util.*;

class Elevator {
    IElevatorState elevatorState;
    IDoorState doorState;
    List<Integer> listOfMovingUpRequestedFloor = new ArrayList<>();
    List<Integer> listOfMovingDownRequestedFloor = new ArrayList<>();
    int currentFloor = 0;

    public Elevator() {
        this.elevatorState = new ElevatorIdleState(this);
        this.doorState = new DoorClosedState(this); 
    }

    void handleRequest(int floorNo) {
        elevatorState.handleRequest(floorNo);
    }

    void handleDoorRequest(int floorNo) {
        doorState.handleDoorRequest(floorNo);
    }

    void changeState(IElevatorState elevatorState) {
        this.elevatorState = elevatorState;
    }

    void addFloorToMovingUpList(int floor) {
        this.listOfMovingUpRequestedFloor.add(floor);
    }

    void addFloorToMovingDownList(int floor) {
        this.listOfMovingDownRequestedFloor.add(floor);
    }

    void changeDoorState(IDoorState doorState) {
        this.doorState = doorState;
    }
}

interface IElevatorState {
    void handleRequest(int floor);
}

interface IDoorState {
    void handleDoorRequest(int floorNo);
}

class DoorOpenState implements IDoorState {
    Elevator elevator;

    public DoorOpenState(Elevator elevator) {
        this.elevator = elevator;
    }

    @Override
    public void handleDoorRequest(int floorNo) {
        elevator.changeDoorState(new DoorClosedState(elevator));
    }
}

class DoorClosedState implements IDoorState {
    Elevator elevator;

    public DoorClosedState(Elevator elevator) {
        this.elevator = elevator;
    }

    @Override
    public void handleDoorRequest(int floorNo) {
        elevator.changeDoorState(new DoorOpenState(elevator));
    }
}

class ElevatorIdleState implements IElevatorState {
    Elevator elevator;

    public ElevatorIdleState(Elevator elevator) {
        this.elevator = elevator;
    }

    @Override
    public void handleRequest(int floor) {
        if (floor > elevator.currentFloor) {
            elevator.addFloorToMovingUpList(floor);
            elevator.changeState(new ElevatorMovingUpState(elevator));
        } else {
            elevator.addFloorToMovingDownList(floor);
            elevator.changeState(new ElevatorMovingDownState(elevator));
        }
    }
}

class ElevatorMovingUpState implements IElevatorState {
    Elevator elevator;

    public ElevatorMovingUpState(Elevator elevator) {
        this.elevator = elevator;
    }

    @Override
    public void handleRequest(int floor) {
        elevator.addFloorToMovingUpList(floor);
    }
}

class ElevatorMovingDownState implements IElevatorState {
    Elevator elevator;

    public ElevatorMovingDownState(Elevator elevator) {
        this.elevator = elevator;
    }

    @Override
    public void handleRequest(int floor) {
        elevator.addFloorToMovingDownList(floor);
    }
}

Note: I removed the Display class to make it shorter. You’ll probably need additional logic to manage elevator and door operations, like figuring out the direction based on the current position and requests or opening or closing the door only in specific situations. However, the above provides a starting point to help you fix the fundamental issues.

Happy Learning :slight_smile:

Could you please help me in writting the above implementation is the command line program that receive the request and door state changes and elevator start moving up or down and if all the request filled then stop and get in the open state


Course: https://www.educative.io/courses/developing-microservices-with-spring-boot
Lesson: Basics of MVC, Microservices, and Spring Boot

Hello @Sahil_Siddiqui,

Here’s a simple command-line program that receives requests and door state changes, and the elevator starts moving up or down. The program stops when all requests are filled and the elevator enters the open state:

import java.util.Scanner;

public class ElevatorSystem {

    public static void main(String[] args) {
        Elevator elevator = new Elevator();
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("Enter floor number for request (or type 'exit' to stop): ");
            String input = scanner.nextLine();

            if (input.equalsIgnoreCase("exit")) {
                break;
            }

            try {
                int requestedFloor = Integer.parseInt(input);
                elevator.handleRequest(requestedFloor);

                // Simulate door state changes
                System.out.println("Enter 'open' to open the door or 'close' to close the door: ");
                String doorInput = scanner.nextLine();

                if (doorInput.equalsIgnoreCase("open")) {
                    elevator.handleDoorRequest(requestedFloor);
                } else if (doorInput.equalsIgnoreCase("close")) {
                    elevator.handleDoorRequest(requestedFloor);
                } else {
                    System.out.println("Invalid door state input. Please enter 'open' or 'close'.");
                }

            } catch (NumberFormatException e) {
                System.out.println("Invalid input. Please enter a valid floor number or 'exit' to stop.");
            }
        }

        System.out.println("All requests filled. Elevator is now in the open state.");
        scanner.close();
    }
}

This program continuously prompts the user to enter floor numbers for requests and door state changes. It handles these inputs and updates the elevator state accordingly. The program stops when the user types ‘exit,’ and it prints a message indicating that all requests are filled, and the elevator is now in the open state.

Note: Please update the code according to your needs and ensure that the changes align with the structure and functionality of the Elevator, ElevatorState, and DoorState classes.