Design BookMyShow/an online movie booking System LLD(OOD)
public class BMSService  {

	List<CinemaHall> cinemas;

	public List<Movie> getMovies(Date date, String city);
	public List<CinemaHall> getCinemalHalls(String city);

}

public class CinemaHall {

	int cinemaHallId;
	String cinemaHallName;

	Address address;

	List<Audi>audiList;

	public Map<Date, Movies> getMovies(List<Date> dateList);
	public Map<Date, Show> getShows(List<Date> dateList);

}

public class Address {

	int pinCode; //ZipCode
	String street;
	String city;
	String state;
	String country;

}

public class Audi {

	int audiId;
	String audiName;
	int totalSeats;
	List<Show> shows;

}

public class Show {

	int showId;
	Movie movie;
	Date startTime;
	Date endTime;
	CinemaHall cinemaPlayedAt;
	List<Seat> seats;

}

public class Seat {

	int seatId;
	SeatType seatType;
	SeatStatus seatStatus;
	Double price;

}


public enum SeatType {

	DELUX, VIP, ECONOMY, OTHER;

}

public enum SeatStatus {

	BOOKED, AVAILABLE, RESERVED, NOT_AVAILABLE;

}

public class Movie {

	String movieName;
	int movieId;
	MovieRating movieRating;
	Double IMDBRating ;
	int durationInMins;
	String language;
	Genre genre;
	Date releaseDate;
	Map<String, List<Show>> cityShowMap;

}

public enum Genre {

	SCI_FI, DRAMA, ROM_COM, FANTASY;
}

public enum MovieRating {
    U, UA, A, S
}

public abstract class User {

	int userId;
	Search searchObj;
}

public class GuestUser extends User {

	String name;
	Address address;
	
}

public class RegisterMember extends User {
    public Account account;
	public Address address;
	public email;
	public Payment payment;
	public Booking cancelBooking(Booking booking);
	public Booking makeBooking(Booking booking);
	public List<Booking> getBooking();
	public Payment makePayment(Double Amount);
	
}

public class Admin{

	public boolean addMovie(Movie moivie);
	public boolean addShow(Show show);
	public boolean addCinemaHall(CinemaHall cinemas,String City);
	public boolean removeMovie(Movie moivie);
	public boolean removeShow(Show show);
	public boolean removeCinemaHall(CinemaHall cinemas,String City);

}

public class Account {

	String userName;
	String password;

}

public class Search {

	public List<Movie> searchMoviesByNames(String name);
	public List<Movie> searchMoviesByGenre(Genre genre);
	public List<Movie> searchMoviesByLanguage(String language);
	public List<Movie> searchMoviesByDate(Date releaseDate);
}

public class Booking {

	String bookingId;
	Date bookingDate;
	Member member;
	Audi audi;
	Show show;
	BookingStatus bookingStatus;
	double totalAmount;
	List<Seat> seats;
	Payment payment;


}

public class Payment {

	double amount;
	Date paymentDate;
	int transactionId;
	PaymentMethod paymentMethod;
	PaymentStatus paymentStatus;

}

public enum BookingStatus {

	REQUESTED, PENDING, CONFIRMED, CANCELLED;
}

public enum PaymentStatus {

	UNPAID, PENDING, COMPLETED, DECLINED, CANCELLED, REFUNDED;

}
public enum PaymentMethod{

	CREDITCARD, DEBITCARD, UPI, NETBANKING, PAYPAL, PAYLATER;

}
Comments (4)